Linq groupby有两个属性

时间:2015-05-22 14:43:32

标签: c# linq

说我有一份订单清单。每个订单都有一个参考客户和他们购买的产品。像这样:

class Orders 
{
    public int CustomerId {get;set;}
    public int ProductId {get;set;}
}

我想对不同客户拥有同一组产品的所有订单进行分组。

  • 客户1 - 产品1& 2
  • 客户2 - 产品1& 2& 3
  • 客户3 - 产品1& 2
  • 客户4 - 产品3& 4& 5

在这种情况下,客户1和3的订单将在同一组中,而2& 4的订单将拥有自己的组。

这可以通过LINQ实现吗?我开始尝试按CustomerId进行分组,但我对如何从那里开始感到迷茫。

1 个答案:

答案 0 :(得分:7)

有:

List<Orders> orders = new List<Orders>();

orders.Add(new Orders { CustomerId = 1, ProductId = 1 });
orders.Add(new Orders { CustomerId = 1, ProductId = 2 });
orders.Add(new Orders { CustomerId = 2, ProductId = 2 });
orders.Add(new Orders { CustomerId = 2, ProductId = 3 });
orders.Add(new Orders { CustomerId = 3, ProductId = 1 });
orders.Add(new Orders { CustomerId = 3, ProductId = 2 });
orders.Add(new Orders { CustomerId = 4, ProductId = 3 });
orders.Add(new Orders { CustomerId = 4, ProductId = 4 });

LINQ查询:

 var groupedCustomers = 
         orders.GroupBy(i => i.CustomerId)
               .Select(i => new { CUSTOMER = i.Key, 
                                  ORDERS = i.Select(j => j.ProductId)
                                            .OrderBy(j => j)
                                          //.Distinct() to ignore duplicate orders
                                            .ToArray() })
               .ToList();

 var result = groupedCustomers.GroupBy(i => i.ORDERS, new IntArrayComparer()).ToList();

这是比较器。

 public class IntArrayComparer : IEqualityComparer<int[]>
 {    
     public bool Equals(int[] x, int[] y)
     {
         return x.SequenceEqual(y);
     }

     public int GetHashCode(int[] obj)
     {
         return base.GetHashCode();
     }
 }

编辑:如果您正在寻找更智能的GetHashCode功能,可以尝试以下方法:

public int GetHashCode(int[] obj)
{
    return string.Join(",", obj.Select(i => i.ToString())).GetHashCode();
}