如何选择具有最低属性 linq 查询语法的对象
Posted
技术标签:
【中文标题】如何选择具有最低属性 linq 查询语法的对象【英文标题】:How do you select an object with lowest property linq query syntax 【发布时间】:2019-10-06 06:03:23 【问题描述】:我正在尝试使用查询语法来遍历对象列表并选择其 UnitPrice 属性中具有最低 int 的对象。
var lowPrice = from l in DataLoader.LoadProducts()
group l by l.Category into newGroup
select new
cat = newGroup.Key,
lowest = from p in newGroup
where p.UnitPrice < p.UnitPrice
select p
;
上面的代码应该在 UnitPrice 属性中选择一个具有最低值的对象并将其存储到最低属性中。
但我不知道选择具有最低单价的对象的正确语法。
这是我的产品对象的示例。有很多相同类别的产品。我的目标是显示类别名称和该类别下具有最低单价的产品。我认为总共有 6 个类别。
new Product
ProductID = 1,
ProductName = "Chai",
Category = "Beverages",
UnitPrice = 18.0000M,
UnitsInStock = 39
,
new Product
ProductID = 2,
ProductName = "Chang",
Category = "Beverages",
UnitPrice = 19.0000M,
UnitsInStock = 17
,
new Product
ProductID = 3,
ProductName = "Aniseed Syrup",
Category = "Condiments",
UnitPrice = 10.0000M,
UnitsInStock = 13
,
new Product
ProductID = 4,
ProductName = "Chef Anton's Cajun Seasoning",
Category = "Condiments",
UnitPrice = 22.0000M,
UnitsInStock = 53
,
【问题讨论】:
您是指每个类别的最低价格吗?如果你只想最低,试试这个,看看它是否有效:(from l in DataLoader.LoadProducts() select l.UnitPrice).Min();
我正在考虑选择具有最低 UnitPrice 而不是价格本身的对象。
正常的做法是先按单价下单再做组。那么较低的价格将是该组中的 First() 项。
然后按单价下单,取FirstOrDefault
。听起来你不需要分组。
什么是DataLoader.LoadProducts()
?如果这是 LINQ to objects 或 LINQ to SQL 后端,这会产生很大的不同。无论哪种方式,您的问题都有很多重复项。
【参考方案1】:
如果您的意思是在每个类别中选择价格最低的单个对象,则解决方案如下:
var lowestPriceCategories = DataLoader.LoadProducts()
.GroupBy(x => x.Category)
.Select(x => new
Category = x.Key,
LowestPrice = x.OrderBy(y => y.UnitPrice).FirstOrDefault()
);
【讨论】:
感谢 Yurii 的建议。它似乎工作得很好。我只需要使用查询语法来解决这个问题。【参考方案2】:感谢大家的支持。我能够根据大家的建议创建一些我认为可以满足我需要的东西。
var lowPrice = from l in DataLoader.LoadProducts()
group l by l.Category into newGroup
select new
cat = newGroup.Key,
lowest = (from p in newGroup
orderby p.UnitPrice
select p).First()
;
结果
foreach (var p in lowPrice)
Console.WriteLine($"p.cat p.lowest.ProductName");
【讨论】:
不要混淆这个问题,但您是否关心是否有不止一件商品具有相同的最低价格? 我想这是一个很好的观点。如果有几件商品的最低价格相同怎么办?我该如何解决? 您必须查询价格等于最低价格的所有商品。然后,您最终会得到每个组的序列,而不是每个组的单个项目,因此您必须决定如何呈现它或您的业务逻辑可能会如何变化。 感谢 Crowcoder,您帮了大忙。我会考虑选择所有具有相同最低价格的对象。以上是关于如何选择具有最低属性 linq 查询语法的对象的主要内容,如果未能解决你的问题,请参考以下文章
如何使用linq / lambda计算具有唯一属性的列表中的对象数?