我将如何显示列表<;项目>;因此它们按其中一个属性进行分组

本文关键字:属性 一个 显示 何显示 列表 lt gt 项目 | 更新日期: 2023-09-27 18:24:01

因此,当Item属性不同时,我有一个List<SearchResult> Results,它将为单个Category属性返回多个结果。

例如,结果可能是:

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上工作,并正确地做到这一点,而不是手动编码一个循环,将它们分离成单独的列表。

怎么回事?

我将如何显示列表<;项目>;因此它们按其中一个属性进行分组

诀窍是使用group子句/GroupBy方法。

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>
}

残酷的力量,但。。。(以下所有代码未经测试,但应该或多或少正确)

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