加载列表框的 ObservableCollection 或 IEnumerable 哪个更快?
我目前正在使用 IEnumerable 作为列表框的 ItemSource。
如果我将其更改为 ObservableCollection,它是否会对性能产生任何影响,如果可能的话?
这实际上取决于哪个类正在实现 IEnumerable。IEnumerable 只是一个接口,任何数量的类都可以在实际实现的后面。您并没有真正绑定 IEnumerable,因为那是一个接口,但是您正在绑定一些实现 IEnumerable 的集合/列表。ObservableCollection 还实现了 IEnumerable,因此应该能够安全地将其用作 ItemSource。
通过 IEnumerable 枚举来填充 ListBox 绝不应该成为应用程序的性能瓶颈,除非您将使用一些自定义类在迭代值时执行大量逻辑,在这种情况下,您的设计可能会存在缺陷。
话虽如此,最好的方法当然是简单地测量。没有什么可以替代衡量和做出假设总是可能会回来咬你。
我对 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 添加元素。
如果您绑定到实现IEnumerable
但不是a 的集合,ObservableCollection
例如 a List
,则不会通知绑定目标添加/删除项目。
不使用 ObservableCollection 仅在集合中的项目数不变的情况下才有意义。只有这样才能将 ObservableCollection 与其他对象进行比较。如果项目的数量发生变化,那么您别无选择,只能使用 ObservableCollection。
此外,正如其他用户已经指出的那样,您不必将 ObservableCollection 与 IEnumerable 进行比较,而是与实现 IEnumerable 的类进行比较。
例如,可以在 Stack Overflow 问题ObservableCollection<> 与 List<>中找到比较 ObservableCollection - List 。