我與LINQ合作對象,並有一個函數,其中在某些情況下,我需要調用Aggregate(...)
之前修改底層集合,然後返回到原來的狀態在函數返回Aggregate(...)
的結果之前。我當前的代碼看起來是這樣的:東西比.ToArray()更好的給力LINQ輸出的枚舉
bool collectionModified = false;
if(collectionNeedsModification)
{
modifyCollection();
collectionModified = true;
}
var aggregationResult = from a in
(from b in collection
where b.SatisfysCondition)
.Aggregate(aggregationFunction)
select a.NeededValue;
if(collectionModified)
modifyCollection();
return aggregationResult;
然而,正如寫的,如果我修改集合,我會得到錯誤的結果,因爲我把收集回來的原始狀態之前aggregationResult
枚舉和LINQ結果是懶惰評估。我目前的解決辦法是在我的LINQ查詢中使用.ToArray()
這樣的:
var aggregationResult = (from a in
(from b in collection
where b.SatisfysCondition)
.Aggregate(aggregationFunction)
select a.NeededValue).ToArray();
結果數組的大小永遠是小(< 100項),這樣存儲/處理時間是不是一個問題。這是處理我的問題的最佳方式,還是有更好的方法來強制評估LINQ查詢?
我更喜歡'.LastOrDefault()`。請注意,`LastOrDefault`也是一個捷徑(在我的版本中,.NET 4.5.2)。如果源是一個`IList <>`,它將首先獲得`Count`,然後使用索引器獲取索引爲'Count-1`的元素。例如這個工程(使用Moq):`var listMock = new Mock>(MockBehavior.Strict); listMock.Setup(x => x.Count).Returns(666); listMock.Setup(x => x [665])。返回(「last one」); var last = listMock.Object.LastOrDefault();` –
2014-12-05 12:31:05