Группировать объекты с подходящими свойствами в списки - PullRequest
5 голосов
/ 03 апреля 2012

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

Пример:

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

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

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

Ответы [ 2 ]

11 голосов
/ 03 апреля 2012

Звучит так, будто вы хотите что-то вроде:

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);
    }
}
4 голосов
/ 03 апреля 2012

Перечислимые расширения - ваш друг (являются * вашими друзьями ?:)

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

И .... легендарный хитовый пост Skeet, до того как я это сделал, ПОЗОР!

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

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 используемого типа списка.Это не словарь, но может использоваться аналогично.

...