まず、Tim Schmelterが推奨したList(Of T)
ように、配列の代わりに使用します。それはおそらくより効率的であり、間違いなく扱いやすいでしょう。次に、アイテムの各プロパティを個別のリストに保存するのではなく、単一のアイテムのすべてのデータを保存する独自のタイプを定義することをお勧めします。そうすることで、将来の変更が容易になりますが、リストのサイズを2つではなく1つだけ変更する必要があるため、より効率的になります。
Public Class MyItem
Public Property ScaleDate() As Date
Get
Return _scaleDate
End Get
Set(ByVal value As Date)
_scaleDate = value
End Set
End Property
Private _scaleDate As Date
Public Property ScaleData() As Double
Get
Return _scaleData
End Get
Set(ByVal value As Double)
_scaleData = value
End Set
End Property
Private _scaleData As Double
End Class
Private _myItems As New List(Of MyItem)()
リストを並べ替えるのか、リストを検索するのか、どちらが速いかはわかりません。それはすべて、それがどれだけ大きいか、どれくらいの頻度で変更されるか、そしてどれくらいの頻度でそれを検索するかによって異なります。したがって、両方のオプションを試して、シナリオでどちらがうまく機能するかを自分で確認することをお勧めします。
ソートの場合、独自のタイプがある場合は、それを実装してから、リストIComparable(Of T)
のメソッドを呼び出すことができます。Sort
Public Class MyItem
Implements IComparable(Of MyItem)
Public Property ScaleDate() As Date
Get
Return _scaleDate
End Get
Set(ByVal value As Date)
_scaleDate = value
End Set
End Property
Private _scaleDate As Date
Public Property ScaleData() As Double
Get
Return _scaleData
End Get
Set(ByVal value As Double)
_scaleData = value
End Set
End Property
Private _scaleData As Double
Public Function CompareTo(ByVal other As MyItem) As Integer Implements IComparable(Of MyItem).CompareTo
Return ScaleDate.CompareTo(other.ScaleDate)
End Function
End Class
Private _myItems As New List(Of MyItem)()
'To sort the list after it's been modified:
_myItems.Sort()
リストは、変更されるたびに1回だけソートする必要があります。リストを検索するたびに並べ替える必要はありません。また、それ自体を並べ替えても、前後の検索が速くなるわけではないため、並べ替えられたリストをすばやく検索するfindメソッドを実装する必要があります。たとえば、これらの線に沿った何かが機能するはずです:
Private Function FindIndex(ByVal startDate As Date) As Integer
FindIndex(startDate, 0, _myItems.Count - 1)
End Function
Private Function FindIndex(ByVal startDate As Date, ByVal startIndex As Integer, ByVal endIndex As Integer) As Integer
If endIndex >= startIndex Then
Dim midIndex As Integer = ((endIndex - startIndex) \ 2) + startIndex
If _myItems(midIndex).ScaleDate < startDate Then
Return FindIndex(startDate, midIndex, endIndex)
Else
Return FindIndex(startDate, startIndex, midIndex)
End If
Else
Return startIndex
End If
End Function
ソートされていないリストを検索するには、リスト全体を前後にループするだけで、一致するすべてのアイテムの新しいリストを作成します。
Dim matches As New List(Of MyItem)()
For Each item As MyItem In _myItems
If (item.ScaleDate >= startDate) And (item.ScaleDate <= endDate) Then
matches.Add(item)
End If
Next
または、これらのアイテムの日付がほとんど連続していて、間に大きなギャップがない場合は、Dictionary(Of Date, List(Of MyItem))
オブジェクトを使用してアイテムのリストを保存する価値があります。これには、日付ごとに個別のアイテムのリストが含まれ、すべてハッシュテーブルに格納されます。したがって、特定の日のアイテムのリストを取得または設定するのは非常に高速ですが、日付範囲内のすべてのアイテムのリストを取得するには、日付範囲内の毎日をループしてリストを取得する必要がありますその日の辞書から、それらを1つの一致リストに結合します。
Dim _days As New Dictionary(Of Date, List(Of MyItem))()
'You'd need to loop through and add each item with code like this:
Private Sub AddItem(ByVal item As MyItem)
Dim dayItems As List(Of MyItem) = Nothing
_days.TryGetValue(item.ScaleDate, dayItems)
If dayItems Is Nothing Then
dayItems = New List(Of MyItem)()
_days(item.ScaleDate) = dayItems
End If
dayItems.Add(item)
End Sub
'And then to find all the items in a date range, you could do something like this:
Private Function FindItemsInRange(ByVal startDate As Date, ByVal endDate As Date) As List(Of MyItem)
Dim matches As New List(Of MyItem)()
Dim i As Date = startDate
While i <= endDate
Dim dayItems As List(Of MyItem) = Nothing
_days.TryGetValue(i, dayItems)
If dayItems Is Nothing Then
matches.AddRange(dayItems)
End If
i = i.AddDays(1)
End While
Return matches
End Function