0

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

我目前正在使用 IEnumerable 作为列表框的 ItemSource。

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

4

3 回答 3

4

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

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

话虽如此,最好的方法当然是简单地测量。没有什么可以替代衡量和做出假设总是可能会回来咬你。

于 2012-11-08T08:42:48.413 回答
1

我对 WPF 和 C# 很陌生,但到目前为止我所了解的是,如果您使用 IEnumerable 作为 ItemSource,例如 List,除非您将其替换为 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 添加元素。

于 2012-11-08T08:46:32.200 回答
1

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

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

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

例如,可以在 Stack Overflow 问题ObservableCollection<> 与 List<>中找到比较 ObservableCollection - List 。

于 2012-11-08T09:09:44.370 回答