web-dev-qa-db-ja.com

IListからObservableCollectionに要素を追加します

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); 
}
22
stiank81

あなたができる

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);
    }    
54
Adam Ralph

C#3 +を使用してそれを支援している場合は、独自の拡張メソッドを作成できます。このコードには、動作することを確認するための基本的なテストがいくつかあります。

public static void AddRange<T>(this ObservableCollection<T> coll, IEnumerable<T> items)
{
    foreach (var item in items)
    {
        coll.Add(item);
    }
}
10
RaYell

AddRangeに相当するObservableCollectionがないため、ループが唯一の方法です。

1
Richard Szalay

この問題を解決するライブラリがあります。リストをラップできるObservableListが含まれています。次のように使用できます。

List<Bar> currentList = getMyList();
var obvList = new ObservableList<Bar>(currentList);

https://github.com/gsonnenf/Gstc.Collections.ObservableLists

0
Greg

以下はObservableCollection<T>の子孫であり、効率的なメッセージAddRangeとユニットテストを追加しています。

ObservableCollectionはAddRangeメソッドをサポートしていないため、INotifyCollectionChangingはどうですか?以外に、追加されたアイテムごとに通知を受け取ります

0
weston