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