Linq groupby有两个属性

Nai*_*ait 5 c# linq

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

class Orders 
{
    public int CustomerId {get;set;}
    public int ProductId {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

我想将不同客户拥有同一组产品的所有订单分组在同一组中.

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

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

LINQ可以实现这一点吗?我开始尝试分组CustomerId,但我却迷失了如何从那里开始.

Hos*_*Rad 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 });
Run Code Online (Sandbox Code Playgroud)

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();
Run Code Online (Sandbox Code Playgroud)

这是比较器.

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

     public int GetHashCode(int[] obj)
     {
         return base.GetHashCode();
     }
 }
Run Code Online (Sandbox Code Playgroud)

编辑:如果您正在寻找更智能的GetHashCode功能,您可以尝试这样的事情:

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