C# LINQ最小值()和最大值()优化

C# LINQ最小值()和最大值()优化,c#,linq,C#,Linq,我做对了有点困难 我需要为列表中的列表选择最小值和最大值 有没有想过如何创建一个优化类型 var range = allFilteredCars .SelectMany(car => car.LeasingPlans .SelectMany(plan => plan.Durations) .Select(a => a.MonthlyPrice)) .ToList();

我做对了有点困难

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

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

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()
感觉不对劲


有什么想法吗?

我只能想出一种方法来计算
min
max
,只需在整个集合上迭代一次,这可以使用
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;
        }
     }
}
var min=Int32.MaxValue;
var max=Int32.MinValue;
foreach(所有FilteredCars中的var filteredCard)
{
foreach(filteredCard.LeasingPlans中的var leasingPlan)
{
foreach(var车辆租赁计划持续时间)
{
如果(车月价格<分钟)
最小值=汽车月价格;
否则,如果(车月价格>最大值)
最大值=汽车月价格;
}
}
}
假设
MonthlyPrice
Int


我不认为您可以绕过多个
SelectMany
s,但查询中的排序将消除最小值/最大值。这应该会更快,因为您只需排序一次:

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
我们将做一件坏事:一个有副作用的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);
int?最小值=零;
智力?max=null;
所有过滤卡
.选择多个(汽车=>汽车租赁计划
.SelectMany(计划=>plan.Durations))
.选择(a=>
{
if(min==null | | a.MonthlyPricemax.Value)
{
最大值=一个月的价格;
}
返回true;
}).全部(x=>x);
最后,您似乎并不真正需要
范围
结果。。。您只需要
Min()
Max()
,因此我们计算它,并通过使用
All()
强制细化整个
IEnumerable


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

我不知道,排序是O(n lg(n))。获取第一项和最后一项可以在O(n)中完成。不需要排序即可获取min()和max()。这些都可以在一个关卡中找到。同意其他评论者的观点-这不是做事情的最佳方式,事实上比最初的方法更糟糕,因为n不仅仅是几个项目。我的想法也是。从迭代列表两次到迭代列表一次,这确实是最佳解决方案(第二个
if
甚至可以变成
else if
,因为值不能同时小于min和大于max)。LINQ无法在一次过程中计算多个聚合(除了
聚合
,它基本上是丑陋的
foreach
)。