2013-08-20 56 views
4

我想問一些建議,我可以如何簡化下面的foreach塊。我試圖在一個linq語句中做到這一切,但我無法弄清楚如何操作查詢中的「count」值。過濾數據時簡化linq

更多關於我想要實現的細節: - 我有與潛在的重複,其中ID是重複一個巨大的名單,但財產「伯爵」是不同的號碼 - 我想擺脫重複的,但仍然沒有鬆動的「計數」值 - 因此對於具有相同ID的項目我薩姆了「計數」屬性

儘管如此,當前的代碼並不十分好看:

var grouped = bigList.GroupBy(c => c.Id).ToList(); 
foreach (var items in grouped) 
{ 
    var count = 0; 
    items.Each(c=> count += c.Count); 
    items.First().Count = count; 
} 
var filtered = grouped.Select(y => y.First()); 

我不要指望整個解決方案,這些想法也將得到高度讚賞:)

+2

FWIW ReSharper非常擅長將'foreach'代碼轉換爲等效的LINQ語句。 – Yuck

+0

檢查了這一點:http://stackoverflow.com/questions/8919100/linq-groupby-count – muratgu

+0

絕對推薦嘗試resharper eval – Jonesopolis

回答

2
var filtered = bigList.GroupBy(c=>c.Id) 
         .Select(g=> { 
            var f = g.First(); 
            f.Count = g.Sum(c=>c.Count); 
            return f; 
            }); 
+2

強制的。這基本上等同於原始 - 但在查詢過程中原始數據的變化看起來是錯誤的) –

+0

@ReedCopsey:我很想+1 KingKing的回答直到我看到您的評論。您可能想編輯您的答案,以添加更多關於爲什麼選擇避免變更集合的背景信息。 –

+0

@AndrewCoonce我做了+1這個答案,但覺得我需要評論,所以至少知道這確實會導致原始數據的變異。 –

5

既然你突變的集合,我個人只是做一個新的「項目」與統計:

var results = bigList.GroupBy(c => c.Id) 
        .Select(g => new Item(g.Key, g.Sum(i => i.Count))) 
        .ToList(); 

這對從原來的一個簡單的映射到一個新的收集Item實例,具有正確的IdCount值。

+0

對不起,但是你的'Item'可能缺少更多的信息,比如原來的一個沒有'Id'和'Count ',它可能具有比這更多的屬性,OP想要包含/保留所有屬性?我們可以使用'constructor'來創建一個原始類型的新實例,但OP沒有顯示原始類型,所以它被卡住了。 –

+0

@KingKing是的 - 並且需要將其添加到構造中 - 但您應該始終可以通過構造函數(或對象初始值設定項)複製該對象。 –

+0

看起來不錯!但正如@KingKing所提到的那樣,你放棄了所有關於原始數據的信息,這些信息我仍然需要。 – Anelook