【问题标题】:Linq to get row with a minimum value of a column but based on another column valueLinq获取具有最小值但基于另一列值的行
【发布时间】:2019-07-07 03:28:31
【问题描述】:

我看过相关的问题和答案,但没有一个对我有帮助。 我创建了一个 linq 查询来获取这样的 IEnumerable 列表 -

**price**     **car_name**    **location**
  23              carA          locationA
  43              carA          locationB
  56              carA          locationC
  12              carB          locationA
  34              carB          locationB
  46              carB          locationC

现在我只想要每辆车最低价格的行... 提前致谢。

编辑:抱歉,我不清楚我的问题,但我也想要所有位置...我在单独的下拉列表中显示。

【问题讨论】:

  • 你能分享任何现有的代码吗?
  • 关于您的编辑:提供的两个答案已经包含位置(在 Car 对象中)。由于您尚未共享任何现有代码,我们只能猜测如何帮助您将位置放在下拉列表中。

标签: linq asp.net-mvc-5 min


【解决方案1】:

您需要根据汽车名称对集合进行分组,然后按价格对每个组进行排序,这样您就可以做到最低。

var result = carList.GroupBy(x=>x.Name)
                     .Select(x=>x.OrderBy(p=>p.Price).First());

如果你想避免 Order By,你可以使用 Aggregate。

var result = list.GroupBy(x => x.Name)
        .Select(g => g.Aggregate((c1, c2) => c1.Price < c2.Price ? c1 : c2));

Aggregate 只会在集合中迭代一次,以最低价格跟踪汽车。

无论哪种情况,输出样本,

【讨论】:

  • 我也想要所有位置...我必须在下拉列表中显示。
  • 要获取所有位置,可以使用 carList.Select(x=>x.Location).Distinct()
【解决方案2】:
from cs in myContext.CarStore
group cs by cs.car_name into cgroup
 select new {
        Car_Name= cgroup.Key,
        Price= cgroup.Min(cs=> cs.price)});

我认为这可能会有所帮助..

【讨论】:

    【解决方案3】:

    其他人提出了将您的汽车分组到具有相同 CarName 的组的想法。然后他们订购每组中的所有 CarPrice,然后他们采用 FirstOrDefault CarPrice。

    如果您只想要最低 CarPrice,那么订购所有 CarPrice 有点浪费

    为此,我使用GroupBy overload with KeySelector, ElementSelector and ResultSelector

    var cheapestCars = allCars.GroupBy(
    
        // key selector:
        car => car.CarName,
    
        // element selector
        car => car.CarPrice,
    
        // result selector:
        (carName, pricesOfCarsWithThisCarName) => new
        {
            CarName = carName,
            LowestAvailablePrices = pricesOfCarsWithThisCarName.Min(),
        });
    

    【讨论】:

    • OrderBy().First() 只枚举汽车一次,就像您的代码一样。
    • 有趣。如果我查看可查询 orderby 的参考源(谷歌,我不知道如何在评论中添加链接),当您要求第一个元素时,它将执行快速排序。 Whis QuickSort 会对所有元素进行排序,即使您只询问第一个元素。所以即使在找到最小的元素后,也会比较最小的但一个和最小的两个
    • 你可以测试它,发现它对每个项目只评估一次。
    猜你喜欢
    • 2017-10-28
    • 1970-01-01
    • 2020-05-20
    • 2013-06-21
    • 2016-12-17
    • 1970-01-01
    • 2020-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多