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
)。