2012-02-09 54 views
1

因此,我有一個List<SearchResult> Results,當Item屬性不同時,將返回單個Category屬性的多個結果。我將如何顯示一個列表<Item>,以便它們按其中一個屬性進行分組?

因此,例如,結果可能是:

SearchResult[0].Category = "Food" 
SearchResult[0].Item = "Ham" 
SearchResult[1].Category = "Food" 
SearchResult[1].Item = "Cheese" 
SearchResult[2].Category = "Food" 
SearchResult[2].Item = "Crackers" 
SearchResult[3].Category = "Drink" 
SearchResult[3].Category = "Juice" 

現在我想這樣顯示出來:

項目中的食品類包括:火腿,奶酪,和餅乾

飲料類別中的項目包括:飲料

,但是這是我現在有:

@foreach (SearchResult result in Results) 
{ 
    <p>Items in the @result.Category category include: @result.Item </p> 
} 

這當然顯示這樣的數據:

項目中的食品類包括:火腿

食品類別中的項目包括:奶酪

項目中的食品種類包括:餅乾在飲料類

項目包括:果汁

現在我覺得一定是有LINQ魔法我就可以在List工作,這樣做正確,而而不是手動編碼將它們分離成單獨列表的循環。

訣竅是什麼?

回答

3

訣竅是使用group clause/GroupBy Method

var query = from result in Results 
      group result by result.Category; 

@foreach (var g in query) 
{ 
    <p>Items in the @g.Key category include:</p> 
    <ul> 
    @foreach (var x in g) 
    { 
     <li>@x.Item</li> 
    } 
    </ul> 
} 
+0

好的,我遺漏了一些細節,我認爲不會是im portant(垃圾)......但是如果在下一個foreach之前我想與Category一起顯示其他值,那該怎麼辦? 'g'var似乎不允許我訪問它們中的任何一個。 – BigOmega 2012-02-09 19:16:02

+1

這些其他值是否與某個類別中的每個項目相同?然後你可以簡單地在外部foreach中使用'g.First()'的值。 – dtb 2012-02-09 19:19:13

+0

真棒謝謝! – BigOmega 2012-02-09 19:21:04

-1

蠻力,但是......(下面未經測試的所有代碼,而應該是或多或少右)

SearchResult 
    .Select(sr => sr.Category) 
    .Distinct() 
    .ToList() 
    .ForEach(c => 
     Console.Out.WriteLine("Items in the " 
           + c 
           + " category include: " 
           + String.Join(",", 
            SearchResult 
            .Where(i => i.Category == c).Select(i => i.Item))) 
); 

或通過的GroupBy作爲@dtb建議:

SearchResult 
    .GroupBy(sr => sr.Category) 
    .ToList() 
    .ForEach(g => Console.Out.WriteLine("Items in the " 
           + g.Key 
           + " category include: " 
           + String.Join(",", g.Select(i=>i.Item)))); 
+0

爲什麼downvote? – 2012-02-09 19:03:07

+1

不知道誰已經downvoted,但第一個實施不太好。 – 2012-02-09 19:05:13

+1

當然不是 - 它的目的是說明性的。 – 2012-02-09 19:07:26

相關問題