web-dev-qa-db-fra.com

Est-il possible pour une boucle «foreach» d'avoir un contrôle d'état?

Si j'ai une boucle foreach, existe-t-il un moyen de vérifier un booléen également?

Je ne veux pas vérifier une fois à l'intérieur de la foreach() puis casser par exemple. Je veux foreach sur une collection et en même temps évaluer si quelque chose est vrai.

Par exemple, je ne veux pas faire:

    IEnumerable<Job> jobs = currentJobs;

    foreach(Job job in jobs)
    {
        if (found) 
            break;
    }
22
adamwtiko

Vous pouvez toujours le transformer en boucle for.

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

Vous devrez également modifier les travaux de IEnumerable à IList. Je pense que IList servirait mieux vos objectifs. IEnumerable lazy évalue les éléments juste avant d'en avoir besoin et n'inclut pas les méthodes d'aide à la collecte associées.

17
Chuck Callebs

Essayez d'utiliser TakeWhile .

De l'exemple:

    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
        */
20
Scott Whitlock

J'ai trouvé une autre approche:

        foreach (var car in cars) if (!rentedCars.Contains(car))
        {
            // Magic
        }
18
David Diez

Je ne l'aime pas énormément, mais peut-être un peu de LINQ?

bool yourBool = false;
foreach(var item in
    collection.TakeWhile(x => yourBool))
{...}

?

12
Marc Gravell

Ai-je bien compris que vous

  1. avoir une séquence d'éléments
  2. veulent prendre des mesures avec chaque élément
  3. mais vous voulez casser le premier élément que vous rencontrez pour lequel une condition est vraie?

Je ne comprends pas la résistance à l'utilisation des boucles foreach; Je m'en tenir à ce que vous avez ou

foreach(var job in jobs.TakeWhile(x => someCondition(x)) { 
    someAction(job);
}
7
jason

Non, un foreach fonctionne simplement pour chaque élément.

Vous pouvez combiner plusieurs conditions dans une boucle for(a; b; c) régulière. Comme for(a; b && x; c)

1
Henk Holterman