C# LINQ GroupBy для преобразования списка в группу с одним свойством в виде списка значений

У меня есть список объектов list1

Name Value
N1   V100 
N2   V101
N1   V102
N4   V103
N4   V104

Я хочу преобразовать это в сгруппированный список

Name Values
N1   V100, V102 
N2   V101
N4   V103, V104

Когда я использую GroupBy Я все понял, ( list1.GroupBy(key => key.Name) )

Name Values
N1
  N1   V100
  N1   V102
N2
  N2   V101
N4
  N4   V103
  N4   V104

Я просто хочу значения в виде списка.

2 ответа

Решение

После GroupByиспользовать ToDictionary:

source.GroupBy(x => x.Name)
      .ToDictionary(x => x.Key, x => x.Select(e => e.Value).ToList());

Это дает Dictionary<string, List<string>> где ключи - это имена, а значения - списки, составленные из проецирования каждого элемента на string под этой конкретной группой.

Я предполагаю что Value это string только для примера, но на самом деле это не имеет значения, так как решение остается тем же.

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

    source.GroupBy(x => x.Name, y=> y.Value)
          .Select( result => new { Name = result.Name,
                                   Values = result.Select(r=> r.Value).ToList() } );

Словарное решение кажется более интуитивным, так как я вижу все преобразования, происходящие для получения результата.

РЕДАКТИРОВАТЬ:

Потратил слишком много времени на это, вот еще 2 способа сделать это: -

source.GroupBy(grpKey => grpKey.Name, 
                   elementSelector => elementSelector,
                   (resultSelectorName, resultSelectorValues ) => new 
                   {
                     Name = resultSelectorName,
                     Values = resultSelectorValues.Select(v=>v.Value).ToList() 
                   });

2)

source.GroupBy(grpKey => grpKey.Name, 
               elementSelector => elementSelector.Value,
               (resultSelectorName, resultSelectorValue ) => new 
               {
                 Name = resultSelectorName,
                 Values = resultSelectorValue.ToList() 
               });
Другие вопросы по тегам