【问题标题】:Add elements from IList to ObservableCollection将 IList 中的元素添加到 ObservableCollection
【发布时间】:2010-02-02 13:02:57
【问题描述】:

我有一个 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); 
}

【问题讨论】:

    标签: c# list observablecollection


    【解决方案1】:

    你可以的

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

    【讨论】:

    • 谢谢!现在使用 ToList.ForEach 方法。如果我需要不止一个地方,会考虑扩展方法..
    • Enumerable.ToList 扩展方法不必要地分配了一个新的List&lt;T&gt;。我可能会推荐 RaYell 的答案。
    • @Richard - 这是真的,虽然在引擎盖下这确实 new List(list) - 它在内部调用 ((ICollection)list).CopyTo(T[]) 其中IList 的大多数实现(例如 List)调用本机(外部)数组复制函数。这应该非常有效,并且(最多)只涉及必要引用的原子副本,而不是成员的迭代。
    • 在 Prism 4 中,它是 CollectionExtensions.AddRange (msdn.microsoft.com/en-us/library/gg405741(v=pandp.40).aspx)。
    【解决方案2】:

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

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

    【讨论】:

    • Microsoft 的 WPF Prism 项目包括一个类似的扩展方法(尽管它们的版本返回集合,而不是 void,以支持方法链接)。只需引用 Microsoft.Practices.Composite.dll 并添加 using Microsoft.Practices.Composite;
    【解决方案3】:

    循环是唯​​一的方法,因为没有 AddRange 等效于 ObservableCollection

    【讨论】:

      【解决方案4】:

      这里是ObservableCollection&lt;T&gt; 的后代,用于添加消息高效AddRange,以及单元测试:

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

      【讨论】:

        【解决方案5】:

        有一个库可以解决这个问题。它包含一个可以包装 List 的 ObservableList。可以通过以下方式使用:

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

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

        【讨论】:

          【解决方案6】:

          如果你确实想实例化一个 observable 集合并想在 Observable 集合中添加一个新范围,你可以按照我尝试过的以下方法:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-07-13
            相关资源
            最近更新 更多