0

IEnumerable<T>アプリケーションのロード時に作成される約 30,000 レコードのコレクションがあり、これらのレコードは次のように変換さObservableCollection<T>れます (WPF アプリケーションをロードするにはかなりの量が必要です)。

IEnumerable<Person> enumerablePeople; //Initialized and contains around 30,000 records
ObservableCollection<Person> people = new ObservableCollection<Person>(enumerablePeople);

私が使用できる新しいもの以外に、最適化されたまたは高速な方法/方法がいくつかありますか、可能であれば、ある種の遅延読み込みを使用して初期化し、コレクション/アプリケーションをより速くロードするようIEnumerable<Person>に変換できますか.ObservableCollection<Person>

4

2 に答える 2

2

そのコンテンツにアクセスできる唯一の方法IEnumerableは、それらを 1 つずつ列挙することです。IEnumerableとして利用できる場合は、内部配列を取得できる可能性Listがありますが、最終的にはすべてのコンテンツをコピーする必要があると思います。

30000 件の参照をコピーするのにそれほど時間はかかりません。1 ~ 2 秒以上かかる場合は、遅いイベント ハンドラーを呼び出したり、追加されたすべてのアイテムの UI を更新したりしていないことを確認します。

于 2013-05-23T13:22:53.973 に答える
0

人々はあなたを助けようとしていますが、あなたは聞いていません。

どのように「作成」していますか?

IEnumerable<T>

IEnumerable を新規作成できません
この構文は失敗します

IEnumerable<Person> IPeople = new IEnumerable<Person>(); 

アプリケーションのロードで IEnumerable への参照を作成している可能性があります。
しかし、そのようなものがないため、IEnumerable オブジェクトを作成していません。
IEnumerable はコレクションではなくインターフェイスです。新しくすることはできません。

以下のコードを参照してください。
16 ミリ秒で IEnumerable ctor から 100,000 の ObservableCollection を作成しました。

System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
System.Diagnostics.Debug.WriteLine(iPeople.Count().ToString());
System.Diagnostics.Debug.WriteLine(sw.ElapsedMilliseconds.ToString());  // 13 ms
sw.Restart();
ObservableCollection<Person> ocPeople = new ObservableCollection<Person>(iPeople);         
System.Diagnostics.Debug.WriteLine(sw.ElapsedMilliseconds.ToString());  // 16 ms
sw.Restart();
System.Diagnostics.Debug.WriteLine(iPeople.Count().ToString());
System.Diagnostics.Debug.WriteLine(sw.ElapsedMilliseconds.ToString());  //  8 ms
sw.Restart();
System.Diagnostics.Debug.WriteLine(ocPeople.Count().ToString());
System.Diagnostics.Debug.WriteLine(sw.ElapsedMilliseconds.ToString());  //  1 ms
sw.Restart();
List<Person> lPeople = new List<Person>(iPeople);
System.Diagnostics.Debug.WriteLine(sw.ElapsedMilliseconds.ToString());  // 10 ms
sw.Restart();
ObservableCollection<Person> ocPeople2new = new ObservableCollection<Person>(lPeople);
System.Diagnostics.Debug.WriteLine(sw.ElapsedMilliseconds.ToString());  //  6 ms

public IEnumerable<Person> iPeople
{
    get
    {
        for (int i = 0; i < 100000; i++) yield return new Person(i);
    }
}

public class Person
{
    public Int32 ID { get; private set; }
    public Person(Int32 id) { ID = id; }
} 
于 2013-05-23T17:09:46.660 に答える