在 .Net 4.5 中,我有一些列表,其中包含加载耗时的对象。加载一个包含 5000 个对象的列表大约需要 5 秒,因此对于每个循环都需要相当长的时间来执行。
由于对象的初始化一直是我想知道是否有一种类型的列表,或者有一种方法来制作这样的列表,当需要时逐步加载对象。
类似于列表的东西,它会知道有多少对象,但仅在检索对象时才实例化对象。这存在吗?或者有可能制作这样的清单吗?
我正在寻找有关如何完成此操作的建议(如果可行的话),因此 bot C# 或 VB.Net 代码会很好。因此我添加了两个标签。
编辑
我应该补充一点,我尝试过使用延迟加载,但这似乎只是延迟了列表的加载,这并不是真正的解决方案。
编辑
这是我现在正在使用的。请注意,我删除了使用延迟加载的蹩脚尝试并恢复到我昨天使用的方式(这实际上是没有Lazy
对象的延迟加载)
Public Class SISOverlayItemList : Inherits SISBaseObject : Implements IEnumerable(Of SISOverlayItem)
Default Public ReadOnly Property Item(ByVal Index As Integer) As SISOverlayItem
Get
Return New SISOverlayItem(Me.List(Index).ID, Me.Parent)
End Get
End Property
Public ReadOnly Property Items As List(Of SISOverlayItem)
Get
Dim output As New List(Of SISOverlayItem)
Call Me.List.Items.AsParallel.ForAll(Sub(i) output.Add(New SISOverlayItem(i.ID, Me.Parent))
Return output
End Get
End Property
Public ReadOnly Property Parent As SISOverlay
Get
Return Me._Parent
End Get
End Property
Private ReadOnly Property List As SISList
Get
If Me._List Is Nothing Then
Me._List = Me.Application.Lists(Me.Name)
End If
Call Me.Refresh()
Return Me._List
End Get
End Property
Private _List As SISList
Private _Parent As SISOverlay
Public Sub New(ByVal Parent As SISOverlay)
Me._Parent = Parent
Me._Application = Parent.Application
Me._Name = String.Format("Overlay_{0}_Items", Parent.Name)
Call Me.Refresh()
End Sub
Public Sub Refresh()
Call Me.Application.Lists(Me.Name).ScanOverlay(Me.Parent)
End Sub
Public Function GetEnumerator() As IEnumerator(Of SISOverlayItem) Implements IEnumerable(Of SISOverlayItem).GetEnumerator
Return Me.Items.GetEnumerator()
End Function
Private Function GetEnumerator1() As IEnumerator Implements IEnumerable.GetEnumerator
Return Me.GetEnumerator
End Function
结束类
Items
将所有对象从 转换List
为当前列表 ( ) 的项目的属性SISOverlayItem
需要很长时间。如果实例化 an 所需的参数ID
需要对存储在.SISOverlayItem
Application
List
如果可以小批量执行这些调用,那么它应该消除实例化列表中每个对象所需的长时间延迟。