ListBox和ComboBoxes的集合比较

时间:2015-03-27 20:37:49

标签: c#

我看过这篇文章 Pros and Cons of using Observable Collection over IEnumerable

我的问题是ComboBoxes / ListBoxes:

是否有关于这种绑定可以使用的集合类型的摘要,我的意思是哪种集合类型可以用于绑定到ListBoxes / ComboBoxes Kind的ItemsSource。为了能够绑定到ItemsSource,每个集合必须实现哪些接口 在渲染速度和异步优势方面,这些Collection中的任何一个是否都具有某些优势/优势,假设虚拟化设置为开启?或者,一旦设置了ItemsSource,它就没关系了吗?

  1. 可枚举
  2. ReadOnlyCollection
  3. 的ObservableCollection
  4. ...

1 个答案:

答案 0 :(得分:3)

我无法回答您要求的速度比较,因为列出的内容完全不同。

让我简单解释一下:

IEnumerable只是一个为您提供一堆扩展方法和迭代器功能的接口。实现IEnumerable的值得注意的集合类将是例如Dictionary<>或ObservableCollection<>

List<>(我假设你不是ReadOnlyCollection)是IReadOnlyCollection的具体实现,它包含了实现IReadOnlyCollection接口的现有类。您将其传递给构造函数,它将为您提供对集合内容的只读访问权。

IList实现ObservableCollectionIEnumerable接口等。

假设从您的问题的上下文中,您询问是否存在可以绑定到IListComboBoxe s的特定集合,这些集合在速度方面更受欢迎。

让我们看一下WPF ListBoxe

它的ComboBox属性要求ItemsSource,如上所述,您可以使用任何实现该接口的具体类。您提到IEnumerable,其中一个很有趣,因为它实现了ObservableCollection接口。

它允许您执行以下操作:如果您INotifyCollectionChanged绑定ObservableCollection ItemsSource,则可以执行以下操作:来自ComboBox的{​​{1}}或Add()项将收到有关更改的通知,并通过在下拉列表中添加或删除可见内容列表中的项目来反映该更改。如果您使用例如相反,Remove()不会发生,您必须再次重新绑定/重新分配ComboBox

让我们回到速度问题,我们可以将其分解为几个部分:

  1. 构建您的收藏: 列表构建比List<>更便宜 仅仅是因为Observable集合必须这样做 反复举起ItemsSource事件。所以如果你知道的话 你的收藏永远不会改变,你可以完全构建它 在将其分配给ObservableCollection之前,您可以使用CollectionChanged 代替。
  2. 收集的维护:如1所述。如果收集从未改变且可以预先构建,请不要使用ItemsSource,请使用清单 代替
  3. (可能对您最感兴趣)项目的渲染:根据容器(例如ListObservableCollection或其他任何其他内容),将花费最多的时间 除非控件虚拟化项目,否则渲染项目。
  4. - #3意味着什么? 想象一下,你有300个项目的集合并将其分配给你的容器:

    • 如果它没有虚拟化,它将开始渲染所有需要一段时间的300个项目,但是你可能只会在屏幕上看到它们的一部分而其他所有项目都被隐藏,你必须移动滚动条才能获得他们进入视野。

    • 如果控件可以虚拟化,它将只渲染您现在可以看到的部分,可能还有一些额外的直接相邻,然后滚动时开始渲染按需查看的部分。最初速度明显加快,滚动时可能会慢一些。

    对于包含300个项目的小型列表,第1点和第2点可能非常微不足道,但是您可能希望查看#3。即使已经用于较小的数据集,虚拟化也会产生巨大的差异,因为大部分时间都花在渲染上,特别是如果你有复杂/慢的样式或DataTemplates

    这可能不会直接回答您的问题,而是会提示您关注哪些方向来集中精力。