我有一个集合,我需要找到一个价格最低的项目,如果超过1,发现默认情况下应该选择任何一个,并且它的isPriceSelected属性需要设置为false。
我正在尝试这样的事情。
lstBtn.Where(p => p.CategoryID == btnObj.CategoryID &&
p.IsSelected == true && p.IsPriceApplied == true)
.ToList()
.Min(m=>m.Price)
答案 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();
首先会找到指定CategoryID
,IsSelected
和IsPriceApplied
全部设置为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()
此查询将返回一个价格最低的产品清单(如果没有重复价格,只有一个项目)。然后你可以用它做任何事情。