我有以下代码:
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子句,所以很震惊。任何帮助非常感谢。我想在循环中使用计数值....
答案 0 :(得分:12)
我认为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
}
答案 1 :(得分:2)
只要你不需要任何计数变量
,这应该可以做你想要的mongoengine.errors.NotRegistered
答案 2 :(得分:0)
var qry = from v in Vehicles
where v.Something == ?
select v.Mode
qry现在只是v.Mode的枚举,你的标准是真的。
答案 3 :(得分:0)
如果添加扩展方法
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");
});
请注意,您不能在Where
之前使用ForEach
,否则您的索引值就会错误。
P.S。:我会在右侧延长ForEach
作为你的家庭作业;)
答案 4 :(得分:0)
找到这种方式。感谢Tim Schmelter。在您的指导下,找到了这个答案。 感谢所有试图帮助我的人。
Vehicles.Where(v => v.Mode== true)
.ToList()
.ForEach(v =>
{
});
这很有用。
答案 5 :(得分:-2)
Vehicle.tolist().where(I => I.example == condition). Tolist();
或者使用.where(s =&gt; s.mode).Tolist(); 这只是检查
的条件的一个示例条件