我假设 Mode
是一个布尔属性。那么您只需要这个小查询和一个 foreach
:
foreach(Vehicles v in Vehicles.Where(x => x.Mode))
{
}
你的方法效率非常低下。如果
Vehicles
不是列表或数组,
Vehicles.Count()
会枚举整个查询以计算数量。更糟糕的是,在循环中使用
ElementAt
,因为它也会枚举整个序列直到到达给定索引,但甚至对于每次迭代都是如此。
最后一个方法使用
Vehicles.ToList().ForEach
没有明显的原因创建了一个新列表,只是为了能够使用
ForEach
方法,这与普通的
foreach
循环没有任何优势。它也没有按这个属性过滤车辆。
如果你需要一个计数器,正如注释所说,你只需要增加一个局部变量即可。
int count = 0;
foreach(Vehicles v in Vehicles.Where(x => x.Mode))
{
count++;
}
或者直接在LINQ查询中选择索引并转换为匿名类型:
var modeVehicles = Vehicles
.Where(x => x.Mode)
.Select((x, index) => new { Count = index + 1, Vehicle = x });
foreach(var x in modeVehicles)
{
int count = x.Count;
Vehicles v = x.Vehicle;
}
这两种方法都返回与谓词匹配(Mode
为true
)的车辆数量。
如果你希望得到所有车辆中该车辆(包括非匹配的车辆)的数量,有三个选项:
1.) 如果它实际上是一个列表或数组,则使用for循环(在这种情况下应优先考虑):
var list = Vehicles as IList<Vehicles>;
if(list != null)
{
for (int count = 0; count < list.Count; count++)
{
if (list[count].Mode)
{
}
}
}
2.) 使用简单的 foreach
和 if
:
int count = 0;
foreach(Vehicles v in Vehicles)
{
if (v.Mode)
{
}
count++;
}
3.) 或者像这样的 LINQ 查询(请注意,在 Where
之前先选择索引):
var modeVehicles = Vehicles
.Select((x, index) => new { Count = index + 1, Vehicle = x })
.Where(x => x.Mode);
foreach (var x in modeVehicles)
{
int count = x.Count;
Vehicles v = x.Vehicle;
}
Vehicles
不是列表或数组,则Vehicles.Count()
将枚举整个查询以计算计数。更糟糕的是,在循环中使用ElementAt
,因为它也会枚举整个序列,直到达到给定的索引,甚至在每次迭代中都会这样做。 - Tim Schmelterforeach
循环,加上一个Where
查询:foreach (var vehicle in Vehicles.Where(v => v.Mode))
。 - Jon SkeetVehicles.Where(x => x.Mode).ToList().ForEach(x => { // do something with x })
吗? - haim770.Where()
或者.Select()
可以做到... - ne1410s