IsDirty比较的集合快照

时间:2010-08-25 19:35:59

标签: c# wpf silverlight editing

为后续的IsDirty检查存储集合快照的好方法(快速,高效等)是什么?

干杯,
Berryl

3 个答案:

答案 0 :(得分:4)

如果您只想保存快照并检查列表大小是否更改(添加/删除项目)

var snapshot = new List<Foo>(list);

但是,如果您要更改列出的项目并想要检查项目是否已更改,则必须克隆每个项目。如果你只是将它们填入另一个列表中,引用应该保持不变。

var snapshot = list.Select(item => new Foo 
                                  { 
                                      Property1 = item.Property1,
                                      ... , 
                                      PropertyN = item.PropertyN 
                                   });

如果您只是想查看列表的计数是否更改,您可以使用第一个版本。

也许您的对象上有一个标识符,可以简化

之类的解决方案
var snapshot = list.Select(item => item.Id);

ID列表可用于查看内容是否已更改。如果您的对象对内存使用量很大,这种模式也会有所帮助。

但是,您可以使用包含事件的ObservableCollection<T>来通知您更改。这样,您可以跟踪对集合的所有更改(添加/删除/替换)。

答案 1 :(得分:3)

这取决于你想要什么。

  • 要创建集合的快照,您只需拨打IEnumerable<T>.ToList
  • 如果您还想创建列表和列表中每个对象的快照,则还需要为每个对象创建单独的副本。如何最好地制作副本取决于您的收藏的具体类型。某些类型具有克隆方法。与其他人一起,您可以调用构造函数。某些类型无法轻易复制。

示例:

List<Foo> snapshot = foos.Select(x => new Foo(x)).ToList();

要检查两个IEnumerable<T>是否相等(即检查没有变化),您可以使用SequenceEqual。如果您的课程没有以您需要的方式实施等分,您还需要指定IEqualityComparer

如果您希望有一种有效的方法从其id字段中查找快照中的特定项,则可以使用Dictionary<K, V>而不是列表。致电IEnumerable<T>.ToDictionary以从您的收藏中创建字典。

答案 2 :(得分:0)

您是要检查收藏品还是每个成员?

一种方法是使用ObservableCollection<T>。您可以订阅每次修改集合时引发的事件。事件args表示项目和更改类型。