为后续的IsDirty检查存储集合快照的好方法(快速,高效等)是什么?
干杯,
Berryl
答案 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表示项目和更改类型。