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