在对象列表中查找公共元素

本文关键字:元素 查找 对象 列表 | 更新日期: 2023-09-27 18:03:20

我有以下代码

public class OrderDetails
{
    public int OrderId { get; set; }
    public int CustomerId { get; set; }
}
public List<int> GetCustomerIds()
{
    var orderDetails = new List<OrderDetails>
    {
        new OrderDetails {OrderId = 1001, CustomerId = 2001},
        new OrderDetails {OrderId = 1001, CustomerId = 2002},
        new OrderDetails {OrderId = 1002, CustomerId = 2003},
        new OrderDetails {OrderId = 1002, CustomerId = 2002},
        new OrderDetails {OrderId = 1003, CustomerId = 2003},
        new OrderDetails {OrderId = 1003, CustomerId = 2002},     
        //return list of common customerIds.           
    };
} 

我想获得所有订单中共同的CustomerIds的列表。在上面的例子中,我的输出是2002。实现这一目标的干净方式是什么?

在对象列表中查找公共元素

这将完成您想要的:

var result = orders.GroupBy(x => x.CustomerId)
                   .Where(y => y.Count() == orderDetails.GroupBy(z => z.OrderId)
                                                        .Count())
                   .FirstOrDefault()
                   .Key;
输出:

2002年

我们可以从英语查询中读出目的:

  • 将您的收藏分组到CustomerId
  • 通过在OrderId上分组并获得Count()来收集有多少不同的订单
  • 将集合筛选到那些在有订单时经常出现的客户
  • 选择第一个
  • 打印密钥(即CustomerId)

重要提示:如果有多个相同数量的订单,这只会取第一个客户,但将其更改为取所有客户是微不足道的。

首先查找订单总数,然后按客户对订单详细信息进行分组,最后选择与订单总数相同的客户。这假定没有重复的客户订单对。

var numberOrders = orderDetails.Select(orderDetail => orderDetail.OrderId)
                               .Distinct()
                               .Count();
var result = orderDetails.GroupBy(orderDetail => orderDetail.CustomerId)
                         .Where(group => group.Count() == numberOrders)
                         .Select(group => group.Key)
                         .ToList();