LINQ Min()和Max()优化

时间:2018-05-31 08:18:25

标签: c# linq

我在做正确的事情上遇到了一些麻烦。

我需要为列表中的列表中的列表选择最小值和最大值

有没有想过如何创建优化类型?

var range = allFilteredCars
            .SelectMany(car => car.LeasingPlans
                .SelectMany(plan => plan.Durations)
                .Select(a => a.MonthlyPrice))
            .ToList();

        var min = range.Min();
        var max = range.Max();

最后Min()Max()感觉不对。

有什么想法吗?

3 个答案:

答案 0 :(得分:6)

我只想通过在整个集合上迭代一次来计算minmax只有一种方法可以使用foreach循环来完成

var min = Int32.MaxValue;
var max = Int32.MinValue;
foreach(var filteredCard in allFilteredCars)
{
    foreach(var leasingPlan in filteredCard.LeasingPlans) 
    {
        foreach(var car in leasingPlan.Durations) 
        {
          if(car.MonthlyPrice < min)
            min = car.MonthlyPrice;
          else if(car.MonthlyPrice > max)
            max = car.MonthlyPrice;
        }
     }
}
  

假设MonthlyPrice属于Int

答案 1 :(得分:3)

我们会做坏事:带有副作用的linq表达式。

int? min = null;
int? max = null;

allFilteredCars
    .SelectMany(car => car.LeasingPlans
        .SelectMany(plan => plan.Durations))
            .Select(a =>
            {
                if (min == null || a.MonthlyPrice < min.Value)
                {
                    min = a.MonthlyPrice;
                }

                if (max == null || a.MonthlyPrice > max.Value)
                {
                    max = a.MonthlyPrice;
                }

                return true;
            }).All(x => x);

最后,您似乎不需要range结果...您只需Min()Max(),因此我们计算它,并强制整个IEnumerable<> {1}}通过使用All()

进行详细说明

您必须将int?替换为MonthlyPrice的类型!

答案 2 :(得分:1)

我不认为你可以绕过多个var range = allFilteredCars .SelectMany(car => car.LeasingPlans .SelectMany(plan => plan.Durations) .Select(a => a.MonthlyPrice)) .OrderBy(a => a)) .ToList(); var min = range[0]; // get the first var max = range[range.Count-1]; // get the last ,但查询中的订单将消除最小值/最大值。这应该更快,因为你只排序一次:

lambda x: