リストボックスをロードするのに、ObservableCollectionとIEnumerableのどちらが高速ですか?
現在、リストボックスのItemSourceとしてIEnumerableを使用しています。
これをObservableCollectionに変更した場合、可能であればパフォーマンスに影響はありますか?
これは、実際にはどのクラスがIEnumerableを実装しているかによって異なります。IEnumerableは単なるインターフェースであり、実際の実装の背後には任意の数のクラスが存在する可能性があります。IEnumerableはインターフェイスであるため、実際にはバインドしませんが、IEnumerableを実装するコレクション/リストをバインドします。ObservableCollectionはIEnumerableも実装しているため、代わりにItemSourceとして安全に使用できるはずです。
リストボックスを埋めるためにIEnumerableを介して列挙することは、値を反復処理するときに多くのロジックを実行するカスタムクラスを使用する場合を除いて、アプリケーションのパフォーマンスのボトルネックになることはありません。その場合、設計に欠陥がある可能性があります。
そうは言っても、最善の方法はもちろん単純に測定することです。測定に代わるものはなく、仮定を立てることは、後であなたを噛むために常に戻ってくる可能性があります。
私はWPFとC#にまったく慣れていませんが、これまでに理解したことは、リストなどのItemSourceとしてIEnumerableを使用する場合、リストを次のリストに置き換えない限り、そのリストの変更を確認できないということです。別のもの:
IEnumerable<int> myList = new List<int>();
myList.Add(3);
この場合(変更されたGUIを通知するために必要なすべてのことを行う場合myList
)、何も起こりません。代わりに、このようなことを行う場合は、次のようにします。
myList = new List<int> { 100, 200, 300 };
GUIに通知されます。
代わりに、ObservableCollectionを使用すると、メソッドで新しい要素を追加した場合でもGUIに通知されますAdd
。したがって、リストボックスに要素を追加するかどうかを決定する必要があります。
を実装IEnumerable
し、それが、などではないコレクションにバインドするObservableCollection
場合List
、バインドターゲットは、追加/削除されたアイテムについて通知されません。
ObservableCollectionを使用しないことは、コレクション内のアイテムの数が変更されない場合にのみ意味があります。その場合にのみ、ObservableCollectionを他のオブジェクトと比較することが理にかなっています。アイテムの数が変更された場合は、ObservableCollectionを使用する以外に選択肢はありません。
さらに、他のユーザーがすでに指摘しているように、ObservableCollectionをIEnumerableと比較する必要はありませんが、IEnumerableを実装するクラスと比較する必要があります。
例として、ObservableCollection-Listの比較は、StackOverflowの質問ObservableCollection<>とList<>にあります。