1

.Net 4.5 には、読み込みに時間がかかるオブジェクトを含むリストがあります。5000 個のオブジェクトのリストのロードには約 5 秒かかるため、各ループの実行にはかなりの時間がかかります。

オブジェクトの初期化には常に時間がかかるので、オブジェクトが必要なときに徐々にロードされるリストのタイプ、またはこのようなリストを作成する方法があるかどうか疑問に思っていました。

オブジェクトがいくつあるかを知っているリストのようなものですが、オブジェクトが取得されたときにインスタンス化するだけです。これは存在しますか?または、そのようなリストを作成することは可能ですか?

これを行う方法についてのアドバイスを探しています (実行可能な場合)。ボット 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変換するプロパティは、非常に時間がかかっています。のインスタンス化に必要なパラメータがの各アイテムに格納されているオブジェクトへの API 呼び出しを必要とする場合、変換に常に時間がかかるのは何ですか。ListSISOverlayItemIDSISOverlayItemApplicationList

これらの呼び出しを小さなバッチで実行することが可能であれば、リスト内のすべてのオブジェクトをインスタンス化するために必要な長い遅延を取り除く必要があります。

4

1 に答える 1

2

オブジェクトがまだすべて存在しているわけではないようです。アイテムのコレクションをリストとして持つ必要がない場合は、検討する価値がありますyield return。これにより、IEnumerable照会、フィルター処理、または列挙が可能な が得られます。

次のようになります。

public readonly IEnumerable<SISOverlayItem> Items
{
    get
    {
        SISOverlayItem myItem = intermediateList.DoSomeWork();
        yield return myItem;
    }
}

これは非現実的かもしれません。また、多くの処理が含まれる場合、これはプロパティよりもメソッドとして適している可能性があります。コレクションをフィルタリングする方法がわかっている場合は、次のようにすることができます。

public IEnumerable<SISOverlayItem> ProduceSelectedItems()
{
    var intermediateItems = from item in intermediateList
                            where item.isSelected
                            select item;
    foreach (var item in intermediateItems)
    {
        yield return item.DoSomeWork();
    }
}

申し訳ありませんが、確認できる Visual Studio が手元にありませんが、そのようなものが役立つと思います。このアプローチの概要を説明する別の質問はこちらです。

于 2013-02-06T01:35:13.207 に答える