【问题标题】:ObservableCollection or IEnumerable?ObservableCollection 还是 IEnumerable?
【发布时间】:2012-10-28 10:17:13
【问题描述】:

ObservableCollection 和 IEnumerable 哪个加载列表框更快?

我目前使用 IEnumerable 作为 Listbox 的 ItemSource。

如果我将其更改为 ObservableCollection,是否会对性能产生任何影响?

【问题讨论】:

  • 实施并测试这两种解决方案的性能,以找到更适合您的方案的解决方案。如果您真的想深入了解这些信息,请通过性能分析器运行您的代码。
  • ObservableCollection 一个 IEnumerable。关于界面的速度,你无从得知。
  • IEnumerable 是一个迭代器。 ObservableCollection 是一个具体的集合,它公开了一个符合 IEnumerable 接口的迭代器。所以你可能想比较 2 种不同的集合类型..

标签: c# wpf .net-4.0


【解决方案1】:

这实际上取决于哪个类正在实现 IEnumerable。 IEnumerable 只是一个接口,任何数量的类都可以在实际实现的后面。您并没有真正绑定 IEnumerable,因为它是一个接口,但您正在绑定一些实现 IEnumerable 的集合/列表。 ObservableCollection 还实现了 IEnumerable,因此应该能够安全地将其用作 ItemSource。

通过 IEnumerable 进行枚举以填充 ListBox 绝不应该成为应用程序的性能瓶颈,除非您将使用一些自定义类,该类在迭代值时会执行大量逻辑,在这种情况下,您的设计可能会存在缺陷。

话虽如此,最好的方法当然是简单地测量。衡量是无可替代的,做出假设总是很可能会在以后反噬你。

【讨论】:

    【解决方案2】:

    我对 WPF 和 C# 很陌生,但到目前为止我所了解的是,如果您使用 IEnumerable 作为 ItemSource,例如 List,除非您替换,否则您将无法看到该 List 中的更改它与另一个不同:

    IEnumerable<int> myList = new List<int>();
    myList.Add(3);
    

    在这种情况下(前提是您做了所有必要的事情来通知您的 GUI myList 已更改)不会发生任何事情。如果您这样做,请改为:

    myList = new List<int> { 100, 200, 300 };
    

    您的 GUI 将收到通知。

    如果您使用 ObservableCollection,即使您使用 Add 方法添加新元素,您的 GUI 也会收到通知。所以你必须决定是否要向 ListBox 添加元素。

    【讨论】:

      【解决方案3】:

      如果您绑定到实现了IEnumerable 的集合并且不是ObservableCollection,例如List,则绑定目标将不会收到添加/删除项目的通知。

      不使用 ObservableCollection 只有在集合中的项目数不变的情况下才有意义。只有这样才能将 ObservableCollection 与其他对象进行比较。如果项目的数量发生变化,那么您别无选择,只能使用 ObservableCollection。

      此外,正如其他用户已经指出的那样,您不必将 ObservableCollection 与 IEnumerable 进行比较,而是与实现 IEnumerable 的类进行比较。

      作为一个例子,一个比较 ObservableCollection - List 可以在 Stack Overflow 问题中找到ObservableCollection<> vs. List<>

      【讨论】:

        猜你喜欢
        • 2014-11-05
        • 2011-05-15
        • 2012-05-28
        • 2017-08-06
        • 2011-06-30
        • 2011-01-08
        • 2011-09-13
        • 2012-11-14
        • 1970-01-01
        相关资源
        最近更新 更多