【问题标题】:How do you select an object with lowest property linq query syntax如何选择具有最低属性 linq 查询语法的对象
【发布时间】: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 后端,这会产生很大的不同。无论哪种方式,您的问题都有很多重复项。

标签: c# linq


【解决方案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,您帮了大忙。我会考虑选择所有具有相同最低价格的对象。
猜你喜欢
  • 2010-10-29
  • 2022-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-13
  • 2019-05-05
  • 2020-07-15
  • 2017-10-03
相关资源
最近更新 更多