我有一个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);
}
答案 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
消息,还有单元测试:
答案 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中而无需循环。