【发布时间】:2011-04-03 22:20:05
【问题描述】:
有什么好的(快速、高效等)方法来存储集合快照以供后续 IsDirty 检查?
干杯,
浆果
【问题讨论】:
标签: c# wpf silverlight editing
有什么好的(快速、高效等)方法来存储集合快照以供后续 IsDirty 检查?
干杯,
浆果
【问题讨论】:
标签: c# wpf silverlight editing
这取决于你想要什么。
IEnumerable<T>.ToList。例子:
List<Foo> snapshot = foos.Select(x => new Foo(x)).ToList();
要检查两个IEnumerable<T>s 是否相等(即检查没有更改),您可以使用SequenceEqual。如果您的类没有以您需要的方式实现 Equals,您还需要指定 IEqualityComparer。
如果您想有一种有效的方法从其 id 字段中找到快照中的 特定 项,那么您可以使用 Dictionary<K, V> 而不是列表。致电 IEnumerable<T>.ToDictionary 从您的收藏中创建字典。
【讨论】:
如果您只想保存快照并检查列表大小是否发生变化(添加/删除项目)
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>,其中包含通知您更改的事件。这样您就可以跟踪对集合的所有更改(添加/删除/替换)。
【讨论】:
您是要检查集合还是每个成员?
一种方法是使用ObservableCollection<T>。您可以订阅每次修改集合时引发的事件。事件参数表示项目和更改的类型。
【讨论】: