IEnumerable<;上的Foreach>;带有if条件
本文关键字:if 带有 条件 gt 上的 lt IEnumerable Foreach | 更新日期: 2023-09-27 18:29:05
我有以下代码:
IEnumerable<Vehicles> Vehicles;
for (int count = 0; count < Vehicles.Count(); count++)
{
if (Vehicles.ElementAt(count).Mode)
{
}
}
如何使用if条件实现Lambda表达式foreach?
我试过这个:
Vehicles.ToList().ForEach(i=>i.Mode)
我对此感到震惊,因为我不知道如何检查条件,因为intellisense也没有显示where子句。非常感谢您的帮助。我也想在循环中使用计数值。。。。
我假设Mode
是bool
属性。然后你只需要这个小查询和一个foreach
:
foreach(Vehicles v in Vehicles.Where(x => x.Mode))
{
// do something with it
}
你的方法效率很低。如果Vehicles
不是列表或数组,则Vehicles.Count()
枚举整个查询以计算计数。更糟糕的是在循环中使用ElementAt
,因为这也枚举了整个序列,直到它处于给定的索引,但甚至是每次迭代。
使用Vehicles.ToList().ForEach
的最后一种方法是在没有明显原因的情况下创建一个新列表,只是为了能够使用ForEach
方法,该方法与普通的foreach
-循环相比没有任何优势。它也不通过此属性过滤车辆。
如果你需要一个计数器,你只需要增加一个局部变量:
int count = 0;
foreach(Vehicles v in Vehicles.Where(x => x.Mode))
{
count++;
// do something with it
}
或者直接在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;
// do something with it
}
两种方法都返回与谓词匹配的车辆数量(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)
{
// do something with it
}
}
}
2.)使用普通foreach
和if
:
int count = 0;
foreach(Vehicles v in Vehicles)
{
if (v.Mode)
{
// do something with it
}
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;
// do something with it
}
只要你不需要任何的计数变量,这就应该是你想要的
foreach (var vehicle in Vehicles.Where(v=>v.Mode))
{
//do stuff with vehicle
}
var qry = from v in Vehicles
where v.Something == ?
select v.Mode
qry现在是唯一v.Mode的可枚举值,其中您的条件为true。
如果添加扩展方法
public static void ForEach<T>(this IEnumerable<T> @this, Action<int, T> action)
{
int i = 0;
foreach (var item in @this)
action(i++, item);
}
然后你可以用linq风格写(把东西堆在右边),例如:
Vehicles.ForEach((index, vehicle) =>
{
if(vehicle.Mode)
Console.WriteLine($"{vehicle} index {index} is ok");
});
请注意,不能在ForEach
之前使用Where
,否则会得到错误的索引值。
附言:我把右边的扩展ForEach
留作你的家庭作业;)
就是这样找到的。感谢Tim Schmelter。在你的指导下,找到了这个答案。感谢所有帮助我的人。
Vehicles.Where(v => v.Mode== true)
.ToList()
.ForEach(v =>
{
});
这起到了作用。
Vehicle.tolist().where(I => I.example == condition). Tolist();
或者使用.where(s=>s.mode).Tolist();这只是where检查中的一个示例条件,用于检查的条件