Nesneler için LINQ ile çalışıyorum ve bazı durumlarda Aggregate(...)
numaralı telefonu aramadan önce temel koleksiyonu değiştirmem ve daha sonra özgün durumuna döndürmem gereken bir işlev var. funciton önce Aggregate(...)
sonuçlarını döndürür. Ben koleksiyon değiştirirseniz aggregationResult
sayılan ve LINQ önce geri özgün haliyle koleksiyonu atıyorum çünküLINQ çıktısının numaralandırılmasını zorlamak için .ToArray() öğesinden daha iyi bir şey
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;
Ancak yazıldığı gibi, yanlış bir sonuç elde edecek: My geçerli kod şöyle görünür Sonuçlar tembel olarak değerlendirilmiştir. Benim şimdiki çözüm böyle benim LINQ sorgusunda .ToArray()
kullanmaktır:
var aggregationResult = (from a in
(from b in collection
where b.SatisfysCondition)
.Aggregate(aggregationFunction)
select a.NeededValue).ToArray();
çıkan dizinin boyutu her zaman (< 100 öğe) böylece bellek/işlem süresi bir endişe değil küçük olacaktır. Sorunumu çözmenin en iyi yolu bu mu yoksa LINQ sorgusunun değerlendirmesini zorlamak için daha iyi bir yol var mı?
tercihim '.LastOrDefault()'. 'LastOrDefault' ayrıca kısa bir yol alır (benim versiyonumda .NET 4.5.2).Kaynak bir "IList <>" ise, önce "Count" değerini alır ve sonra indeksleyiciyi "Count - 1" indeksi ile almak için kullanır. Örneğin bu çalışma (Moq kullanır): 'var listMock = yeni Mock> (MockBehavior.Strict); listMock.Setup (x => x.Count) .Returns (666); listMock.Setup (x => x [665]). Döndürür ("sonuncu"); var last = listMock.Object.LastOrDefault(); ' –