2010-12-02 10 views
14

Si tengo un bucle foreach, ¿hay alguna forma de verificar también un booleano?¿Es posible que un ciclo 'foreach' tenga una verificación de estado?

No quiero marcar una vez dentro del foreach() y luego romper por ejemplo. Quiero foreach sobre una colección y al mismo tiempo evaluar si algo es cierto.

Por ejemplo, yo no quiero hacer:

IEnumerable<Job> jobs = currentJobs; 

    foreach(Job job in jobs) 
    { 
     if (found) 
      break; 
    } 
+0

Podría dar un ejemplo? Estoy un poco confundido con lo que quieres decir ... lo que significa que otras personas probablemente también estén confundidas. –

+0

¿Podría proporcionar más detalles y/o un ejemplo? – LukeH

+1

te refieres a algo como foreach (elemento var en MyList.Where (condición)) – Kikaimaru

Respuesta

14

Siempre se puede convertir en un bucle.

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

Usted también necesitará cambiar trabajos desde IEnumerable a IList. Creo que IList serviría mejor a tus propósitos. IEnumerable perezosa evalúa los elementos justo antes de que los necesite y no incluye los métodos auxiliares de recolección asociados.

+3

Solo puede hacer esto si la colección proporciona una propiedad 'Count' (y presumiblemente también un indexador ya que" hay muchas cosas buenas "que probablemente requiera el acceso a los elementos por índice). El ejemplo en la pregunta usa 'IEnumerable ' que tampoco tiene. – LukeH

+0

Ah, está bien. Él no tenía ese ejemplo publicado cuando respondí. He arreglado mi respuesta. –

1

No, un foreach simplemente funciona para cada elemento.

Puede combinar varias condiciones en un bucle normal for(a; b; c). Me gusta for(a; b && x; c)

9

No me encanta, pero tal vez algunos LINQ?

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

?

+2

Eso simula un continuar, no un descanso. –

+0

@Henk - ¿mejor? –

+1

@Henk - y para ser justos, hasta que se haya agregado el ejemplo, la intención era ambigua. –

11

Intente utilizar TakeWhile.

A partir del ejemplo:

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

Ojalá pudiera votar esto dos veces. –

2

Estoy entendiendo correctamente que

  1. tienen una secuencia de elementos
  2. querer tomar alguna acción con cada elemento
  3. pero desea rompa el primer elemento que encuentre para el cual alguna condición es verdadera?

No entiendo la resistencia al uso de foreach bucles; Yo ya sea seguir con lo que tiene o

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

me encontré con otro enfoque:

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

Creo que esta debería ser la respuesta. Todavía esto es lo que estoy buscando. ¡Gracias! – AdorableVB

Cuestiones relacionadas