我有一个对象列表 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
我只想将值作为列表。
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() } );
词典解决方案似乎更加直观,因为我可以看到所有发生的变换生成结果。
编辑:
花了太多时间在这方面,这还有其他两种实现这一目标的方法: -
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()
});