2010-12-02 1 views
14

Si j'ai une boucle foreach, y a-t-il un moyen de vérifier un booléen?Est-il possible pour une boucle 'foreach' d'avoir un contrôle de condition?

Je ne veux pas vérifier une fois à l'intérieur du foreach(), puis rompre 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; 
    } 
+0

Pourriez-vous donner un exemple? Je suis un peu flou sur ce que vous voulez dire ... ce qui signifie que d'autres personnes sont probablement aussi confuses. –

+0

Pourriez-vous fournir plus de détails et/ou un exemple? – LukeH

+1

vous voulez dire quelque chose comme foreach (var article dans MyList.Where (condition)) – Kikaimaru

Répondre

14

vous pouvez toujours en faire une boucle.

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

Vous devez également changer d'emploi IEnumerable-IList. Je pense que IList servirait mieux vos objectifs. IEnumerable paresseux évalue les éléments juste avant d'en avoir besoin et n'inclut pas les méthodes auxiliaires de collecte associées.

+3

Vous ne pouvez le faire que si la collection fournit une propriété 'Count' (et vraisemblablement aussi un indexeur car" faire beaucoup de choses intéressantes "nécessitera probablement l'accès aux éléments par index). L'exemple de la question utilise 'IEnumerable ' qui n'a pas non plus. – LukeH

+0

Ah, d'accord. Il n'a pas eu cet exemple affiché quand j'ai répondu. J'ai corrigé ma réponse. –

1

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)

9

Pas énormément d'amour, mais peut-être un peu LINQ?

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

?

+2

Cela simule un continuer, pas une pause. –

+0

@Henk - mieux? –

+1

@Henk - et pour être juste, jusqu'à ce que l'exemple a été ajouté l'intention était ambiguë. –

11

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 
     */ 
+0

Je souhaite que je pourrais upvote ceci deux fois. –

2

Suis-je comprends bien que vous

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

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

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

J'ai trouvé une autre approche:

 foreach (var car in cars) if (!rentedCars.Contains(car)) 
     { 
      // Magic 
     } 
+0

Je pense que cela devrait être la réponse. C'est toujours ce que je cherche. Merci! – AdorableVB

Questions connexes