我在做正确的事情上遇到了一些麻烦。
我需要为列表中的列表中的列表选择最小值和最大值
有没有想过如何创建优化类型?
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()
感觉不对。
有什么想法吗?
答案 0 :(得分:6)
我只想通过在整个集合上迭代一次来计算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;
}
}
}
假设
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: