"foreach"循环是否可以进行条件检查?

ada*_*iko 20 c# foreach

如果我有一个foreach循环,有没有办法检查一个布尔值?

我不想在内部检查foreach()然后打破例如.我想要foreach收集一个集合,同时评估某些事情是否属实.

例如,我不想这样做:

    IEnumerable<Job> jobs = currentJobs;

    foreach(Job job in jobs)
    {
        if (found) 
            break;
    }
Run Code Online (Sandbox Code Playgroud)

Sco*_*ock 19

尝试使用TakeWhile.

从示例:

    string[] fruits = { "apple", "banana", "mango", "orange", 
                          "passionfruit", "grape" };

    IEnumerable<string> query =
        fruits.TakeWhile(fruit => String.Compare("orange", fruit, true) != 0);

    foreach (string fruit in query)
    {
        Console.WriteLine(fruit);
    }

        /*
         This code produces the following output:

         apple
         banana
         mango
        */
Run Code Online (Sandbox Code Playgroud)


Dav*_*iez 17

我找到了另一种方法:

        foreach (var car in cars) if (!rentedCars.Contains(car))
        {
            // Magic
        }
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这只是单语句控制流;即,只是一个嵌套在“foreach”中的“if”语句,没有括号。 (3认同)
  • 我想这应该是答案。这仍然是我正在寻找的。谢谢! (2认同)

Chu*_*ebs 15

你总是可以把它变成for循环.

for (i = 0; i < jobs.Count && booleanTrue; i++) {
 // do a lot of great stuff
}
Run Code Online (Sandbox Code Playgroud)

您还需要将工作从更改IEnumerableIList.我认为IList会更好地满足你的目的.IEnumerablelazy在您需要之前评估元素,并且不包括关联的集合助手方法.

  • 如果集合提供了一个`Count`属性(并且可能也是一个索引器,因为"做很多很棒的东西"可能需要涉及通过索引访问元素),你只能这样做.问题中的例子使用了`IEnumerable <Job>`,它没有. (3认同)

Mar*_*ell 11

不是很喜欢它,但也许是一些LINQ?

bool yourBool = false;
foreach(var item in
    collection.TakeWhile(x => yourBool))
{...}
Run Code Online (Sandbox Code Playgroud)

  • 这模拟了一个继续,而不是休息. (2认同)

jas*_*son 6

我能正确理解你吗?

  1. 有一系列元素
  2. 想对每个元素采取一些行动
  3. 但是你想要突破你遇到的第一个元素是否属实?

我不明白使用foreach循环的阻力; 我会坚持你拥有或拥有的东西

foreach(var job in jobs.TakeWhile(x => someCondition(x)) { 
    someAction(job);
}
Run Code Online (Sandbox Code Playgroud)