Linq获取具有一列最小值但基于另一个列值的行

时间:2019-02-13 10:22:37

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

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

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

现在我只希望每辆车的最低价格行... 预先感谢。

编辑:对不起,我不清楚我的问题,但我也想知道所有位置...我在一个单独的下拉列表中显示。

4 个答案:

答案 0 :(得分:0)

我认为类似的方法应该起作用:

cars.GroupBy(c => c.Name)
    .Select(g => g.OrderBy(c => c.Price).First());

您按名称对汽车进行分组,然后按价格对每个组进行排序,并获取每个组中的第一辆汽车。

答案 1 :(得分:0)

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)});

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

答案 2 :(得分:0)

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

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

如果您想避免订购依据,可以使用Aggregate。

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

集合在整个集合中仅迭代一次,以最低的价格跟踪汽车。

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

enter image description here

答案 3 :(得分:0)

其他人提出了将您的汽车分组为具有相同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(),
    });