首页 > 解决方案 > Linq 查询返回最便宜的产品,只有它是唯一的

问题描述

我有一个Products 列表,其中Price. 我想买最便宜的,只要它是独一无二的。如果有多个 相同Product的最低价格,则不应返回任何.

在下面的示例中,对于uniqProductList查询应该返回BestOnewhile 对于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 },
};

标签: c#linqfiltering

解决方案


如果您想在单个查询中执行此操作,这是一种方法:

Product result = uniqProductList
    .GroupBy(x => x.Price)
    .OrderBy(x => x.Key)
    .Take(1)
    .FirstOrDefault(x => x.Count() == 1)?
    .FirstOrDefault();
  • 按价格对结果进行分组
  • 按价格排序,以便最便宜的是第一个结果
  • 取第一个结果,因为我们对其他结果不感兴趣
  • 如果组中只有一个结果,则返回分组
  • 返回值

不过,几乎可以肯定还有其他更快的方法。


推荐阅读