如何显示List <item>,以便按其中一个属性对其进行分组?</item>

时间:2012-02-09 18:55:58

标签: c# linq razor

List<SearchResult> Results属性不同时,我有一个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上工作并正确地执行此操作,而不是手动编码将它们分成单个列表的循环。

诀窍是什么?

2 个答案:

答案 0 :(得分: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>
}

答案 1 :(得分:-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)))
);
@dtb建议的

或GroupBy:

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))));