如何使用linq查找集合中的最小值?

时间:2013-11-25 14:32:31

标签: c#

我有一个集合,我需要找到一个价格最低的项目,如果超过1,发现默认情况下应该选择任何一个,并且它的isPriceSelected属性需要设置为false。

我正在尝试这样的事情。

lstBtn.Where(p => p.CategoryID == btnObj.CategoryID && 
                  p.IsSelected == true && p.IsPriceApplied == true)
      .ToList()
      .Min(m=>m.Price)

3 个答案:

答案 0 :(得分:7)

只需选择您想要的最小属性:

var minimumPrice = lstBtn
   .Where(p => p.CategoryID == btnObj.CategoryID && p.IsSelected && p.IsPriceApplied)
   .Min(p => p.Price);

如果您确实想要找到订购该集合所需的最低价格的商品:

var itemWithMinimumPrice = lstBtn
   .OrderBy(p => p.Price)
   .FirstOrDefault(p => p.CategoryID == btnObj.CategoryID && p.IsSelected && p.IsPriceApplied);

或者这可能更有效:

var itemWithMinimumPrice = lstBtn
   .Where(p => p.CategoryID == btnObj.CategoryID && p.IsSelected && p.IsPriceApplied)
   .OrderBy(p => p.Price)
   .FirstOrDefault();
如果没有项与谓词匹配,

Enumerable.FirstOrDefault会返回一个项目或null

答案 1 :(得分:2)

您可以尝试这样的事情:

var result = lstBtn
    .Where(p => p.CategoryID == btnObj.CategoryID && p.IsSelected && p.IsPriceApplied)
    .OrderBy(p => p.Price)
    .First();

首先会找到指定CategoryIDIsSelectedIsPriceApplied全部设置为true的所有项目,然后按Price对项目进行排序,并返回第一项价格最低的商品。

答案 2 :(得分:1)

开箱即用,linq只能使用Min和Max方法返回实际值。 你可以使用一个好的项目morelinq https://code.google.com/p/morelinq/wiki/OperatorsOverview 它有你需要的方法。对于我自己,我发现这个项目有太多的方法,所以我只需要从其来源剪切和粘贴。 使用morelinq,您的代码应如下所示:

lstBtn.Where(p => p.CategoryID == btnObj.CategoryID && p.IsSelected == true && p.IsPriceApplied==true).MinBy(m=>m.Price)

另一种方法,如果你还需要获得所有重复项:

var lowestPriceProducts = lstBtn.Where(p => p.CategoryID == btnObj.CategoryID)
    .GroupBy(p => p.Price, new { p.Price, Product = p})
    .OrderByDescending(x => x.Price)
    .First()
    .Select(x => x.Product)
    .ToList()

此查询将返回一个价格最低的产品清单(如果没有重复价格,只有一个项目)。然后你可以用它做任何事情。