关于IEnumerable<>的Foreach如果条件

时间:2016-01-05 14:42:40

标签: c# lambda

我有以下代码:

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子句,所以很震惊。任何帮助非常感谢。我想在循环中使用计数值....

6 个答案:

答案 0 :(得分:12)

我认为Modebool属性。然后你只需要这个小查询和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
}

答案 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(); 这只是检查

的条件的一个示例条件