C#Linq使用groupby转换集合

时间:2016-07-01 09:35:10

标签: c# linq

我有一个类似于

的类的列表
public class MyClass
{
   public ComplexType A {get;set;}
   public ComplexTypeB B {get;set;}
}

var myList = new List<MyClass>();

然后我有一个目标Dto,看起来像这样

public class MyTargetDto
{
    public ComplexType A {get;set;}
    public List<ComplexTypeB> ListOfB {get;set;}
}

只有myTargetDto支持ComplexType分组

才非常相似

鉴于MyClass的平面列表,我如何(使用Linq)将其转换为MyTargetDto的目标列表?

4 个答案:

答案 0 :(得分:1)

你应该这样做。

myList.GroupBy(x=>x.A)
      .Select(x=> new MyTargetDto()
       {
           A= x.Key,
           ListOfB = x.Select(s=>s.B).ToList()
       });

答案 1 :(得分:0)

myList.GroupBy(item => item.A)
    .Select(group => new MyTargetDto
    {
        A = group.Key,
        ListOfB = group.Select(item => item.B).ToList()
    });

答案 2 :(得分:0)

如果您的ComplexType没有自己的Equals实施,那么您需要实施IEqualityComparer<ComplexType>

public class Comparer : IEqualityComparer<ComplexType>
{
    public bool Equals(ComplexType x, ComplexType y)
    {
        // code to check your complex type for equality
    }
    public int GetHashCode(ComplexType obj)
    {
        return obj.GetHashCode();
    }
}

然后,您可以使用此比较器使用GroupBy对您的列表进行分组:

List<MyClass> flatList = ...
List<MyTargetDto> result = flatList.GroupBy(e => e.A, e => e.B, new Comparer())
                                   .Select(g => new MyTargetDto {
                                         A = g.Key,
                                         ListOfB = g.ToList()});
                                    .ToList();

如果ComplexType已经有一个适当的Equals实现,那么你可以省略比较器:

List<MyTargetDto> result = flatList.GroupBy(e => e.A, e => e.B)
                                   .Select(g => new MyTargetDto {
                                         A = g.Key,
                                         ListOfB = g.ToList()})
                                    .ToList();

GroupBy的第一个lambda选择列表分组的元素。这将是结果Key中的IGrouping属性 第二个lambda选择应该包含在该组中的元素。

最终Select为每个群组创建MyTargetDto,将其A属性设置为ComplexType并创建ListOfB。< / p>

答案 3 :(得分:0)

正如其他人已经发布的那样,解决方案就是

myList.GroupBy(x => x.A, x => x.B)
      .Select(g => new MyTargetDto()
      {
          A = g.Key,
          ListOfB = g.ToList()
      });

只是希望您使用GroupBy overload

查看现有的快捷方式
myList.GroupBy(x => x.A, x => x.B, (key, g) => new MyTargetDto()
{
    A = key,
    ListOfB = g.ToList()
});