2014-09-11 81 views
0

如何有效地将IEnumerable转换为ObservableCollection而不在WPF应用程序中创建新的ObservableCollection将IEnumerable转换为ObservableCollection

我见过的所有例子都需要创建一个新的ObservableCollection,但我不希望这样。

回答

5

如果潜在的对象是而不是ObservableCollection,也没有任何其后代,那么根本就不能这样做。

“铸造”的对象确实两件事情之一:

  1. 的铸造,重新解释参考到不同类型的,但是这仅适用于如果底层类型,不同类型的,或实现该接口如果你正在投射界面。
  2. A转换,像int a = (int)dbl;

你的情况,也不会因为工作有没有这样的转换可用,并且重新解释只有在基础类型一个ObservableCollection工作,所以你留下了什么你不想做的事:

您需要创建一个新的ObservableCollection

2

“铸造”实际上正在创造新的集合,如果对象不能在含蓄地诠释。无法通过开箱即用的解决方案将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; 
    } 
} 
0

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

相关问题