ObservableCollection或IEnumerable?

时间:2012-11-08 08:35:15

标签: c# wpf .net-4.0

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

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

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

3 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:1)

我对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添加元素。

答案 2 :(得分:1)

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

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

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

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