2014-08-31 41 views
0

例如,我有這樣的代碼:如何打破源收集和LINQ結果之間的聯繫

IEnumerable<RSuspectOperationCode> distinctCodes = this.Distinct(); // "this" is some collection 
this.Clear() 
distinctCodes.Count(); 

由於LINQ的延遲執行查詢 - 伯爵給我們0我有意思 - 有沒有辦法通過就地結果計算並打破源和結果集合之間的鏈接,獲得一個獨特的集合,清除源集合將不會影響結果集合?

我的解決方法:

List<RSuspectOperationCode> distinctCodes = new List<RSuspectOperationCode>(); 
    distinctCodes.AddRange(this.Distinct(comparer)); 
    this.Clear(); 
    distinctCodes.Count(); 

但是,我不知道,有沒有更優雅/短呢?

+0

對不起,通過內存類型代碼,mistakened的 – 2014-08-31 07:55:39

+0

可能重複[強制LINQ到不耽誤執行] (http://stackoverflow.com/questions/1064043/force-linq-to-not-delay-execution) – 2014-08-31 07:58:05

回答

0

您需要調用某個方法來評估查詢。在你的情況下,調用ToArrayToList將通過評估查詢並將結果置於新陣列或List<RSuspectOperationCode>中來做你想要的。新列表不會受到您對原始列表所做的任何更改的影響。

請注意,很多人默認使用ToList,這是錯誤的。不管情況如何,如果你不打算改變列表的長度,那麼你應該使用數組而不是集合。這意味着ToArray應該是您的默認選擇,只有在您特別需要List<T>時才使用ToList。這不是一個大問題,但你也可以做正確的事情。

+3

*這意味着ToArray應該是您的默認選擇*我相信'ToArray'最終可能會比ToList擁有更多的內存分配,因爲數組必須是它所代表的集合的確切大小,而List將其容量與其容量尺寸。 http://stackoverflow.com/a/16323412/242520 – 2014-08-31 07:48:00

+1

是的,我知道'List '是如何實現的。 'ToList'和'ToArray'都遵循相同的分配模式,直到最後,在這種情況下,ToList被完成,但如果ToArray分配了一個大於必需的數組,它必須分配另一個數組正確的大小和複製一切到它。所以通過使用'ToList'你可以跳過這個開銷。 – 2014-08-31 07:52:59

1

每當您希望立即執行,請致電.ToList()

var distinctCodes= this.Distinct().ToList(); 

this.Clear(); 

var c1 = this.Count(); // 0 

var c2 = distinctCodes.Count(); // eg. 100 
+0

這不會有不同的延期執行。 – brz 2014-08-31 07:58:46

+0

@ user3246354他沒有要求在其不同的清單上執行延期執行。他只是想要一個不同的項目清單。 – Vland 2014-08-31 11:32:28

+0

我指的是就地結果計算,「有沒有一種方法可以獲得具有就地結果計算的獨特集合,並打破源和結果集合之間的鏈接,清除源集合不會影響結果集合?」 – brz 2014-08-31 11:34:30

0

我用在LINQ表達式來獲取enumeratio做的末尾添加.ToList(),並有收集的副本。

在你的情況,

... = this.Distinct().ToList() 

應該做的伎倆。

1

而不是調用後鮮明的ToList的,所以你必須推遲執行之前把它在不同的列表:

var distinctCodes = this.ToList().Distinct();