2

我必须在 c# 中制作一些程序,并且为了在我必须使用的程序之间执行 IO,或者使用INotifyPropertyChange(on a List<>) 或ObservableCollection<>.

我想知道哪个更适合在 c# 程序之间执行 IO 操作。

感谢您阅读

4

4 回答 4

8

根据您在问题和评论中列出的标准,您最好使用 ObservableCollection。

INotifyPropertyChanged 接口的存在就是为了告诉您 - 属性已更改。当您谈论列表时,属性将是 Count 和 Item[] 之类的东西。这意味着,实际上,您实际上被告知的只是“列表的内容已更改”,而不是有关该更改实际内容的任何细节。如果没有任何此类信息,您的控件真正能做的就是完全基于集合的当前状态重绘自身。

但是,使用 ObservableCollection,您会被告知何时添加项目(以及该项目是什么以及添加的位置)和删除项目的时间(以及该项目是什么以及它曾经在哪里)。对于您的 UI 控件而言,这些信息已经足够,只需重新绘制实际更改的内容,这比重新绘制整个内容要高效得多。这就是 ObservableCollection 被发明的原因——使用它!

于 2013-05-31T08:14:56.923 回答
4

请注意,ObservableCollection 继承了 INotifyCollectionChanged 和 INotifyPropertyChanged。

[SerializableAttribute]
public class ObservableCollection<T> : Collection<T>, 
    INotifyCollectionChanged, INotifyPropertyChanged

请参阅上面链接中的文档:

在许多情况下,您使用的数据是对象的集合。例如,数据绑定中的一个常见场景是使用 ListBox、ListView 或 TreeView 等 ItemsControl 来显示记录的集合。您可以枚举实现 IEnumerable 接口的任何集合。但是,要设置动态绑定以便集合中的插入或删除自动更新 UI,集合必须实现INotifyCollectionChanged接口。此接口公开CollectionChanged事件,该事件应在基础集合更改时引发。

WPF 提供ObservableCollection 类,它是实现INotifyCollectionChanged接口的数据集合的内置实现。在实现您自己的集合之前,请考虑使用ObservableCollection或现有集合类之一,例如 List、Collection 和 BindingList 等。如果您有一个高级场景并且想要实现自己的集合,请考虑使用 IList,它提供了一个可以通过索引单独访问的非泛型对象集合。实现 IList 可为数据绑定引擎提供最佳性能。

于 2013-05-31T08:13:27.047 回答
1

INotifyPropertyChanged用于在有界属性值或集合发生更改时通知 UI。而ObservableCollection用于在修改绑定集合时通知 UI(例如从集合中添加或删除对象)如果集合对象之一中的属性值发生更改,则无法通知 UI。

于 2013-05-31T07:54:02.797 回答
1

这两个替代方案不做同样的事情。您正在这两个选项之间进行选择:

  1. 一个列表属性实现INotifyPropertyChanged,每次修改列表时都会在其中抛出事件
  2. 类型的属性ObservableCollection

使用选项 1,当您修改列表时,会引发一个事件,显示“整个列表已更改”。如果您有一个绑定到此列表的 UI 元素(例如 a ListBox),则必须重新绘制整个元素,因为它必须假定整个列表已更改(即:它可能不再是同一个列表! )。

使用选项 2,您将引发有关列表中添加或删除的单个项目的特定事件。如果您有一个绑定到此列表的 UI 元素,它可以通过仅修改与这些元素相关的 UI 来响应。

考虑从列表中删除项目并且列表绑定到 WPFListBox控件的示例。使用选项 1,将重新创建列表的全部内容。使用选项 2,已删除项目的控件将被删除,但列表的其余部分保持不变。

从这个例子中应该清楚的是ObservableCollection——因为它支持特定于你正在做的事情的事件——在许多情况下会更有效。也就是说,除非您在集合中有大量数据或非常复杂的 UI,否则性能提升将是微不足道的。此外,如果您对列表进行大量修改,您可能会发现刷新整个列表会更快。

最终,没有任何性能问题可以在 StackOverflow 上准确回答,而无需重复口头禅:分析您的代码,并根据结果做出决定。

于 2013-05-31T08:21:23.080 回答