【问题标题】:Cast IEnumerable into ObservableCollection将 IEnumerable 转换为 ObservableCollection
【发布时间】:2014-11-05 08:04:25
【问题描述】:

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

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

【问题讨论】:

标签: .net ienumerable observablecollection


【解决方案1】:

如果底层对象不是ObservableCollection,也不是它的任何后代,那么根本就不能这样做。

“铸造”一个对象会做以下两件事之一:

  1. 强制转换,重新解释对不同类型的引用,这仅在基础类型该不同类型时才有效,或者如果您要强制转换为接口,则实现接口。
  2. 转换,如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;
       }
    }
    

    【讨论】:

      【解决方案3】:

      给定一个未知的任意类型的IEnumerable,没有办法知道什么时候发生了可能改变返回序列的事情。如果希望在序列更改时收到通知,并且无法识别IEnumerableIEnumerator 的特定实现,那么可以合理地希望做的最好的事情是定期将序列枚举到一个数组中,将结果与之前的枚举,并在发现某些内容发生更改时引发通知事件。如果馆藏量小,时效性要求不是太严格,这样的做法是可行的;然而,人们可能应该限制愿意检查的数据量以及用于检查数据的可用时间的比例。否则尝试观看大型序列可能会占用大量内存、CPU 时间或两者兼而有之。

      【讨论】:

        猜你喜欢
        • 2017-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-17
        相关资源
        最近更新 更多