c# - Linq 查询返回最便宜的产品,只有它是唯一的
问题描述
我有一个Product
s 列表,其中Price
. 我想买最便宜的,只要它是独一无二的。如果有多个 相同Product
的最低价格,则不应返回任何.
在下面的示例中,对于uniqProductList
查询应该返回BestOne
while 对于dupProductList
,不应该返回任何产品。
如何编写Linq查询?
public class Product
{
public string Name { get; set; }
public decimal Price { get; set; }
public DateTime ExpiryDate { get; set; }
}
List<Product> uniqProductList = new List<Product>() {
new Product { Name = "GoodOne", Price = 12M },
new Product { Name = "NiceOne", Price = 12M },
new Product { Name = "ExpensiveOne", Price = 15M },
new Product { Name = "BestOne", Price = 9.99M }
};
List<Product> dupProductList = new List<Product>() {
new Product { Name = "GoodOne", Price = 12M },
new Product { Name = "NiceOne", Price = 12M },
new Product { Name = "ExpensiveOne", Price = 15M },
};
解决方案
如果您想在单个查询中执行此操作,这是一种方法:
Product result = uniqProductList
.GroupBy(x => x.Price)
.OrderBy(x => x.Key)
.Take(1)
.FirstOrDefault(x => x.Count() == 1)?
.FirstOrDefault();
- 按价格对结果进行分组
- 按价格排序,以便最便宜的是第一个结果
- 取第一个结果,因为我们对其他结果不感兴趣
- 如果组中只有一个结果,则返回分组
- 返回值
不过,几乎可以肯定还有其他更快的方法。