使用if条件的IEnumerable<>中的foreach循环

3
我有以下代码:

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)

由于我不知道如何检查条件,因为智能感应也没有显示where子句,所以我困惑了。非常感谢任何帮助。我还想在循环中使用计数值....


4
非常低效。如果Vehicles不是列表或数组,则Vehicles.Count()将枚举整个查询以计算计数。更糟糕的是,在循环中使用ElementAt,因为它也会枚举整个序列,直到达到给定的索引,甚至在每次迭代中都会这样做。 - Tim Schmelter
3
基本上不要这样做。使用普通的 foreach 循环,加上一个 Where 查询:foreach (var vehicle in Vehicles.Where(v => v.Mode)) - Jon Skeet
1
你是想要使用 Vehicles.Where(x => x.Mode).ToList().ForEach(x => { // do something with x }) 吗? - haim770
2
你在这个迭代中希望实现什么?看起来 .Where() 或者 .Select() 可以做到... - ne1410s
“implement lambda expression foreach” 是什么意思? - Lasse V. Karlsen
6个回答

11

我假设 Mode 是一个布尔属性。那么您只需要这个小查询和一个 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
}

这两种方法都返回与谓词匹配(Modetrue)的车辆数量。

如果你希望得到所有车辆中该车辆(包括非匹配的车辆)的数量,有三个选项:

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.) 使用简单的 foreachif

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
}

我想在循环中使用计数值...如何使用计数变量?请帮助我。 - curiousDev
@curiousDev:所以你需要知道循环中当前车辆的编号?那么使用一个本地的int变量,在foreach中递增它。如果你需要无论Mode属性是true还是false都需要这个变量,那么你应该简单地使用foreach循环(或者如果它是列表或数组,则使用for)并在循环中使用if。这是最简单和最有效的方法。 - Tim Schmelter
我不需要车辆数量。根据布尔值,需要根据车辆的顺序(即第一辆车还是第三辆车)显示相应的消息。 - curiousDev
@curiousDev:还不清楚,如果你有三辆车,第二辆的“Mode”为“true”,你需要哪个数字?是一、二和三(因此对于每辆车而言,无论属性如何),只有二(因为那是“Mode=true”的那辆车),还是只有一(因为只有一辆车的该属性为“true”)? - Tim Schmelter
如果是第二辆车,我想要2。 - curiousDev
显示剩余3条评论

2
只要你不需要 count 变量做任何事情,这应该可以满足你的需求。
foreach (var vehicle in Vehicles.Where(v=>v.Mode))
{
    //do stuff with vehicle
}

我希望在if条件检查中使用count变量。 - curiousDev
@curiousDev,说得好。如果您需要对整个车辆列表进行索引,则一开始的代码是正确的,无需使用lambda表达式。如果您只想为每个符合条件的车辆添加一个新编号,则可以添加一个本地变量 var count=0; foreach (var vehicle in Vehicles.Where(v=>v.Mode)) { //do stuff with vehicle ++count; } - FonnParr

0
var qry = from v in Vehicles
          where v.Something == ?
          select v.Mode

qry现在是一个可枚举的v.Mode,其中满足您的条件。


2
没有迹象表明 OP 只想要 v.Mode。这是原始代码中的条件。 - Jon Skeet

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");
});

注意,在这样的ForEach之前不能使用Where,否则会得到错误的索引值。

P.S.:我会把在右侧扩展ForEach作为你的家庭作业;)


0

找到了解决方式。感谢Tim Schmelter的指导,找到了答案。 感谢所有曾经尝试帮助我的人。

             Vehicles.Where(v => v.Mode== true)
                     .ToList()
                     .ForEach(v => 
                     {

                      });

这个有效。


-2
Vehicle.tolist().where(I => I.example == condition). Tolist();

或者使用 .where(s => s.mode).ToList(); 这只是 where 检查中的一个条件示例,用于你想要进行条件检查的内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接