ObservableCollectionがあり、IListのコンテンツをこれに設定したいのですが。これで、コレクションの新しいインスタンスを作成できます。
public ObservableCollection<Bar> obs = new ObservableCollection<Bar>();
public void Foo(IList<Bar> list)
{
obs = new ObservableCollection<Bar>(list);
}
しかし、実際にIListのコンテンツを取得して、既存のObservableCollectionに追加するにはどうすればよいですか?すべての要素をループする必要がありますか、それとももっと良い方法がありますか?
public void Foo(IList<Bar> list)
{
foreach (var Elm in list)
obs.Add(Elm);
}
あなたができる
public void Foo(IList<Bar> list)
{
list.ToList().ForEach(obs.Add);
}
または拡張方法として、
public static void AddRange<T>(this ObservableCollection<T> collection, IEnumerable<T> items)
{
items.ToList().ForEach(collection.Add);
}
C#3 +を使用してそれを支援している場合は、独自の拡張メソッドを作成できます。このコードには、動作することを確認するための基本的なテストがいくつかあります。
public static void AddRange<T>(this ObservableCollection<T> coll, IEnumerable<T> items)
{
foreach (var item in items)
{
coll.Add(item);
}
}
AddRange
に相当するObservableCollection
がないため、ループが唯一の方法です。
この問題を解決するライブラリがあります。リストをラップできるObservableListが含まれています。次のように使用できます。
List<Bar> currentList = getMyList();
var obvList = new ObservableList<Bar>(currentList);
https://github.com/gsonnenf/Gstc.Collections.ObservableLists
以下はObservableCollection<T>
の子孫であり、効率的なメッセージAddRange
とユニットテストを追加しています。