Группировать объекты с соответствующими свойствами в списки

У меня есть список объектов на С#. Все объекты содержат свойства code1 и code2 (среди прочих свойств).

Пример:

List -> object = id, name, code1, code2, hours, amount.

Существует 31 возможное значение code1. Существует 10 возможных значений code2.

Мне нужно сгруппировать вместе все объекты, имеющие одинаковые значения code1 и code2 (уникальная комбинация), в свои собственные списки, которые будут сохранены в родительском списке (чтобы каждый отдельный список можно было повторить позже).


person Baxter    schedule 03.04.2012    source источник
comment
Вы пробовали фильтровать свой список с помощью LINQ? Это упрощает фильтрацию списка с помощью синтаксиса Sql Query.   -  person phadaphunk    schedule 03.04.2012


Ответы (2)


Похоже, вы хотите что-то вроде:

var groups = list.GroupBy(x => new { x.code1, x.code2 });

// Example of iterating...
foreach (var group in groups)
{
    Console.WriteLine("{0} / {1}:", group.Key.code1, group.Key.code2);
    foreach (var item in group)
    {
        Console.WriteLine("  {0} ({1})", item.id, item.name);
    }
}
person Jon Skeet    schedule 03.04.2012
comment
Будет ли это работать так же, как если бы я привел его к новому объекту =› list.GroupedBy(x=›new TempObject{x.code1,x.code2}); - person cpoDesign; 19.03.2014

Enumerable extensions — ваш друг (* ваши друзья? :)

var groups = lists.GroupBy(item => new { item.code1, item.code2 });

И… легендарный пост по тарелочкам раньше меня, ПОЗОР!

Время до одного вверх по тарелочкам (ха, правильно). Вы также можете сгруппировать общие элементы в словаре.

var mapping = list
  .GroupBy(item => new { item.code1, item.code2 })
  .ToDictionary(g => g.Key, g => g.ToList());

Теперь отображение представляет собой Dictionary<anon{code1, code2}, List<YourObject>>. Конечно, вы можете оставить ToList для значения, и тип значения словаря будет IGrouping, который является IEnumerable.

Вы также можете использовать ToLookup

var lookup = list.ToLookup(item => new { item.code1, item.code2 });

Результатом является ILookup, который имеет ключ заданного типа ключа и представляет собой IEnumerable используемого типа списка. Это не словарь, но его можно использовать аналогичным образом.

person payo    schedule 03.04.2012
comment
Было бы проще использовать list.ToLookup(x => new { item.code1, item.code2 }) :) - person Jon Skeet; 03.04.2012