C# LINQ GroupBy 将 List 转换为一个组,其中一个 属性 作为值列表
C# LINQ GroupBy to convert a List to a group with one property as List of values
我有一个对象列表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()
});
我有一个对象列表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()
});