将IEnumerable转换为ObservableCollection

时间:2014-09-11 11:32:02

标签: .net ienumerable observablecollection

如何有效地将IEnumerable投射到ObservableCollection而不在WPF应用程序中创建新的ObservableCollection

我看到的所有示例都需要创建一个新的ObservableCollection,但我不想这样做。

3 个答案:

答案 0 :(得分:5)

如果基础对象不是 ObservableCollection,也不是其任何后代,那么根本无法做到。

"铸造及#34;一个对象做两件事之一:

  1. 强制转换,重新解释对不同类型的引用,这只适用于基础类型 不同类型的情况,或者如果您正在转换为接口,则实现接口。
  2. 转化,例如int a = (int)dbl;
  3. 在你的情况下,由于没有可用的转换,两者都不会起作用,只有当基础类型 一个ObservableCollection时重新解释才有效,所以你留下了什么不想做:

    您需要制作新的ObservableCollection

答案 1 :(得分:2)

"铸造及#34;实际上是创建新集合,如果无法隐式解释对象。没有办法通过开箱即用的解决方案将IEnumerable转换为ObservableCollection。但您可以创建自己的扩展方法。 Yes您必须创建新的ObservableCollection

public static class EnumerableExtension
{       
   public static ObservableCollection<T> ToObservableCollection<T>(this IEnumerable<T> source)
   {
         ObservableCollection<T> collection = new ObservableCollection<T>();
         foreach (T item in source) collection.Add(item);
         return collection;
   }
}

答案 2 :(得分:0)

给定某个未知任意类型的IEnumerable,无法知道何时发生可能会改变返回序列的事件。如果希望在序列发生变化时收到通知,而且没有人认识到IEnumerableIEnumerator的特定实现,那么最好的人可以合理地希望这样做是定期将序列枚举为数组,将结果与先前枚举的结果进行比较,并在发现某些内容发生更改时引发通知事件。如果收集很小并且时效性要求不严格,这种方法可能是可行的;但是,人们可能应该限制一个人愿意检查的数据量以及用于检查它的时间的可用部分。否则,尝试观看大型序列可能会吞噬大量内存,CPU时间或两者兼而有之。