Как бы я отобразил список <Item>, чтобы они были сгруппированы по одному из свойств? - PullRequest
1 голос
/ 09 февраля 2012

Итак, у меня есть 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 ]

3 голосов
/ 09 февраля 2012

Хитрость заключается в использовании group group / 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 голосов
/ 09 февраля 2012

Грубая сила, но ... (весь приведенный ниже код не проверен, но должен быть более или менее правильным)

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))));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...