将IList中的元素添加到ObservableCollection

sti*_*k81 22 c# list observablecollection

我有一个ObservableCollection,我想将IList的内容设置为这个.现在我可以创建一个新的集合实例..:

public ObservableCollection<Bar> obs = new ObservableCollection<Bar>(); 
public void Foo(IList<Bar> list)
{
    obs = new ObservableCollection<Bar>(list); 
}
Run Code Online (Sandbox Code Playgroud)

但是,我怎样才能真正获取IList的内容并将其添加到我现有的ObservableCollection中?我是否必须遍历所有元素,还是有更好的方法?

public void Foo(IList<Bar> list)
{
   foreach (var elm in list)
       obs.Add(elm); 
}
Run Code Online (Sandbox Code Playgroud)

Ada*_*lph 53

你可以做到

public void Foo(IList<Bar> list)
{
    list.ToList().ForEach(obs.Add);
}
Run Code Online (Sandbox Code Playgroud)

或作为延伸方法,

    public static void AddRange<T>(this ObservableCollection<T> collection, IEnumerable<T> items)
    {
        items.ToList().ForEach(collection.Add);
    }    
Run Code Online (Sandbox Code Playgroud)

  • @Richard - 这是真的,虽然在幕后这会做新的List <T>(列表) - 内部调用((ICollection <T>)列表).CopyTo(T [])在大多数IList <T>的实现中(例如List <T>)调用本机(外部)数组复制功能.这应该是非常有效的,并且只涉及(最多)必要引用的原子副本而不是成员的迭代. (3认同)

RaY*_*ell 9

如果您使用C#3 +来帮助您,可以编写自己的扩展方法.此代码已进行了一些基本测试,以确保它的工作原理:

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


归档时间:

查看次数:

32363 次

最近记录:

6 年,1 月 前