1

我有一个对象列表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

我只想将值作为列表。

4

2 回答 2

8

之后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示例目的,但实际上,这并不重要,因为解决方案保持不变。

于 2018-12-19T21:35:29.553 回答
0

有人在此处添加另一个答案(似乎已被删除,我正在尝试这种方法并使其也可以正常工作)。
所有的功劳都归于那个匿名的人。

    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() 
               });
于 2018-12-19T21:54:51.647 回答