如何选择具有最低属性 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 查询具有嵌套列表的对象?

具有匿名类型和用户定义类型的 LINQ 选择查询

如何让 LINQ 返回具有给定属性最大值的对象? [复制]

如何使用linq / lambda计算具有唯一属性的列表中的对象数?

实体框架Linq查询:如何在多个导航属性上从何处选择并从第三个导航属性中选择

如何对集合中所有对象的属性执行.Max()并返回具有最大值的对象[重复]