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子句。非常感谢您的帮助。我也想在循环中使用计数值。。。。

IEnumerable<;上的Foreach>;带有if条件

我假设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
}

只要你不需要任何的计数变量,这就应该是你想要的

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检查中的一个示例条件,用于检查的条件