在 C# 中使用 LINQ 从对象数组中查找最少 3 个不同的项

Finding Minimum 3 Distinct Items From Array of Objects Using LINQ in C#

我有一个 class 客户持有 class 订单数组。

    class Customer
    {
        public string firstname { get; set; }
        public string lastname { get; set; }

        public Order[] orders {get; set;}
    }

这是我的订单class:

     class Order
{
    public string product { get; set; }
    public float price{get; set;}
    public int quantity { get; set; }
}

我正在寻找三种最便宜的产品。

我尝试了很多方法,但 none 似乎有效。这是我目前拥有的:

    var result = customer.SelectMany(x => x.orders);
    var  Least = result.Distinct().OrderBy(x => x.price).Take(3);

我意识到我需要有区别,因为我有许多具有相同产品名称的订单,因此我没有退回最便宜的三种产品,而是将最便宜的产品重复了 3 次。

Distinct() 在这里不起作用,因为它正在选择不同的 Order 对象。通俗地说,这意味着客户 A 以每个 9.99 美元订购的 3 个订书机不同于客户 B 以每个 9.99 美元订购的 2 个订书机,这两者也不同于客户 C 以每个 9.99 美元订购的 3 个订书机。所以本质上你对 Distinct() 的调用实际上是在做 nothing.

你有几个选择。您可以 create an IEqualityComparer 将认为相同产品的 Order 相等,或者您可以使用 GroupBy() 代替:

var query = myListOfCustomers.SelectMany(x => x.Orders)
                .GroupBy(x => new { x.Product, x.Price })
                .Select(x => x.Key)
                .OrderBy(x => x.Price)
                .Take(3);

请注意,这会将 Order 具有名称产品名称但价格不同的产品视为不同的产品。它还假设 Order.Price 是单价。我不知道这些假设是否正确。