在 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
是单价。我不知道这些假设是否正确。
我有一个 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
是单价。我不知道这些假设是否正确。