2010-08-25 54 views

回答

3

这取决于你想要什么。

  • 要创建集合的快照,您可以拨打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从您的收藏中创建一本词典。

+0

+1 for SequenceEqual – 2010-08-25 19:59:46

0

您是否在检查收藏或每个会员?

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

+0

集合,作为默认解决方案。 – Berryl 2010-08-25 19:59:32

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); 

标识的列表可以用于查看内容改变了解决东西的标识符。如果你的对象在内存使用上也很大,这种模式会有所帮助。

但是,您可以使用一个ObservableCollection<T>,它有事件通知您有关更改。通过这种方式,您可以跟踪集合的所有更改(添加/删除/替换)。