将IList中的元素添加到ObservableCollection

时间:2010-02-02 13:02:57

标签: c# list 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); 
}

6 个答案:

答案 0 :(得分:50)

你可以做到

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

答案 1 :(得分:9)

如果您使用C#3 +来帮助您,可以编写自己的扩展方法。此代码已经进行了一些基本测试以确保其有效:

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

答案 2 :(得分:1)

循环是唯​​一的方法,因为AddRange没有ObservableCollection等价物。

答案 3 :(得分:0)

以下是ObservableCollection<T>的后代,可以添加有效的AddRange消息,还有单元测试:

ObservableCollection Doesn't support AddRange method, so I get notified for each item added, besides what about INotifyCollectionChanging?

答案 4 :(得分:0)

有一个库可以解决此问题。它包含一个可以包裹列表的ObservableList。可以按以下方式使用它:

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

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

答案 5 :(得分:0)

如果您要实例化一个可观察的集合,并想向Observable集合添加一个新范围,则可以按照我尝试过的以下方法进行操作:

var list = new List<Utilities.T>();
            list.AddRange(order.ItemTransactions.ToShortTrans());
            list.AddRange(order.DealTransactions.ToShortTrans());
            ShortTransactions = new ObservableCollection<T>(list);

通过这种方式,您可以将范围添加到ObservableCollection中而无需循环。