2010-08-25 55 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>,它有事件通知您有關更改。通過這種方式,您可以跟蹤集合的所有更改(添加/刪除/替換)。