【问题标题】:VB.net get every nth record from arrayVB.net 从数组中获取每第 n 条记录
【发布时间】:2019-08-03 21:46:09
【问题描述】:

我有每分钟接收数千条记录的动态数组,我正在努力实现:

使用计时器我需要从主数组中获取记录。每 1 秒进程应该访问主数组并获取 20 条记录,然后在第二秒之后它将获取接下来的 20 条记录,等等...

实现这一目标的最佳和最快方法是什么?

我有一个主数组,其中包含数千条不断增长的记录:

Public Shared myBigArray() As String = {}

正在使用以下方法将新项目添加到数组中:

Module Module2
<Extension()>
Public Sub Add(Of T)(ByRef arr As T(), item As T)
    Array.Resize(arr, arr.Length + 1)
    arr(arr.Length - 1) = item
End Sub
End Module

myBigArray.Add(message)

要将记录从主数组复制到我使用的新数组:

Array.Copy(myBigArray, smallArray, 20)

我需要循环复制过程,以便复制新记录,每个请求复制 20 条下一条记录。

【问题讨论】:

  • 请展示一下您目前尝试过的代码。
  • 这个问题的答案将取决于您使用数组的方式。当您获取前 20 个项目时,是否应该将它们从源数组中删除?如果是这样,那听起来更像是一个 queue 而不是数组。如果您要坚持使用数组,则会导致大量数组大小调整,这将导致性能非常差并导致大量垃圾回收。
  • 我认为您使用了错误的类型,尤其是在您继续调整数组大小的情况下。使用 Queue 即可完成您想要的操作,将项目放在最后,将项目拉到开头。
  • 我不知道队列。谢谢你们,我会更多地学习队列。
  • 如果需要1秒间隔操作,看一下Timer类,将Interval设置为1000毫秒。

标签: arrays vb.net


【解决方案1】:

在定义了计时器的类中,您需要定义私有整数变量,比如说countOfReads,它将指示从数组中读取元素的次数。

然后您可以使用它从数组中获取数据 - countOfReads20*countOfReads20*(countOfReads+1) - 1 之间的条目从 0 开始(第一次读取,因此索引将介于 0 和 19 之间),等等。

用法:

For i = countOfReads * 20 To (countOfReads + 1)*20 - 1)
    ' fetch your elements with myArray(i)
Next
' increment counter
countOfReads = countOfReads + 1

【讨论】:

    【解决方案2】:

    当你想要它快时,你不应该调整数组的大小。在这种情况下,列表应该更合适。对于这两种情况,您都应该记住 Int32.MaxSize 的最大大小(大约 2 十亿)。

    示例(仍需要一些错误检查等):

    Imports System
    Imports System.Collections.Generic
    
    Public Module Module1
    
        Public Sub Main()
    
            Dim myBigList as New List(of string)
    
            'debug: fill with random nu
            For i As Integer = 1 To 100
                myBigList.Add("string_" & i)    
            Next
    
            Dim _startpos As Integer = 0
            For i As Integer = 1 to 5
                Console.WriteLine("_startpos:" & _startpos )
                For Each _s As String in myBigList.GetRange(_startpos,20)
                    Console.WriteLine(_s)
                Next
                _startpos += 20
            Next
        End Sub
    
    End Module
    

    【讨论】:

    • 但是如何获取范围,例如:前 20 条记录(从 0 到 19),然后在接下来的 20 条记录(从 19 到 39)之后进行下一次调用,等等...
    • myBigList.GetRange([STARTPOS],20), Startpos 是从 0 开始的
    猜你喜欢
    • 1970-01-01
    • 2016-11-26
    • 2022-12-07
    • 2014-08-28
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    相关资源
    最近更新 更多