Estoy pensando en implementar IEnumerable para mi colección personalizada (un árbol) así puedo usar foreach para recorrer mi árbol. Sin embargo, por lo que sé foreach siempre comienza desde el primer elemento de la colección. Me gustaría elegir de qué elemento comienza foreach. ¿Es posible cambiar de alguna manera el elemento desde el que comienza foreach?¿Es posible comenzar a iterar desde un elemento que no sea el primero utilizando foreach?
Respuesta
Sí. Hacer lo siguiente:
Collection<string> myCollection = new Collection<string>;
foreach (string curString in myCollection.Skip(3))
//Dostuff
Skip
es una función IEnumerable que salta sin embargo muchos se especifica a partir del índice actual. Por otro lado, si desea utilizar solamente los tres primeros se usaría .Take
:
foreach (string curString in myCollection.Take(3))
Estos incluso pueden ser emparejados juntos, así que si sólo quería los 4-6 artículos que podría hacer:
foreach (string curString in myCollection.Skip(3).Take(3))
Tenga en cuenta que C# distingue entre mayúsculas y minúsculas, por lo que ninguno de ellos funcionará como se muestra ... –
Buena llamada. WTB autocompletar (gahh no puede recordar el nombre real) en stackoverflow;) – MoarCodePlz
¿Esto realmente se saltea o simplemente crea una copia? ES DECIR.serían estos dos diferentes: 'foreach (Lista
Puede usar Enumerable.Skip para omitir algunos elementos y hacer que comiencen allí.
Por ejemplo:
foreach(item in theTree.Skip(9)) // Skips the first 9 items
{
// Do something
Sin embargo, si usted está escribiendo un árbol, es posible que desee proporcionar un elemento en el elemento del árbol en sí que devolverá un nuevo IEnumerable<T>
que enumerar desde allí hacia abajo. Esto, potencialmente, sería más útil a largo plazo.
Algo como' IEnumerable
Gracias por responder, saltar parece prometedor, leer información de MSDN sobre omisión Llegué a la conclusión de que tal vez es posible escribir un método StartFrom (este árbol IEnumerable
@inferno: Sí, podría hacerlo fácilmente. Sin embargo, solo agregaría un método/propiedad a MyTreeElement que fuera más parecido a: 'IEnumerable
Es más fácil utilizar el método Skip
en LINQ a Objetos para esto, para saltar un número determinado de elementos:
foreach (var value in sequence.Skip(1)) // Skips just one value
{
...
}
Obviamente sólo cambia 1 para cualquier otro valor para saltar un número diferente de elementos ..
De forma similar, puede usar Take
para limitar el número de elementos que se devuelven.
Puede leer más sobre estos (y los métodos relacionados SkipWhile
y TakeWhile
) en my Edulinq blog series.
Jon, ¿esto no corre el riesgo de una excepción si "secuencia" es nula? – WEFX
@WEFX: Bueno, no tenemos idea de si 'sequence' puede ser legítimamente' null' o no. Presumiblemente, los OP pueden manejarlo ellos mismos, no es realmente parte de la cuestión ... –
Foreach
iterará sobre su colección en la forma definida por su implementación de IEnumerable
. Entonces, aunque puede omitir elementos (como se sugirió anteriormente), aún está iterando técnicamente sobre los elementos en el mismo orden.
No estoy seguro de lo que está tratando de lograr, pero su clase podría tener múltiples propiedades IEnumerable
, cada una de las cuales enumera los elementos en un orden específico.
- 1. ¿es posible iterar dos elementos simultáneamente usando foreach en jstl?
- 2. cómo puede iterar elemento foreach en QListWidget
- 3. ¿Es posible crear un Uri que no sea absoluto?
- 4. ¿Es posible iterar a través de JSONArray?
- 5. ¿Qué elemento de matriz es el primero?
- 6. ¿Es posible hacer que Class.forName ("") sea flexible?
- 7. ¿Es probable que alguna vez sea posible compilar desde D 2.0 a Javascript?
- 8. ¿Cómo hacer que un elemento HTML no sea enfocable?
- 9. ¿Es posible crear un HashMap que sea Parcelable en Android?
- 10. eliminando eficazmente elemento desde dentro 'foreach'
- 11. ¿Es posible utilizar LINQPad con un modelo de código primero
- 12. ¿Puedo hacer que un elemento ListView no sea seleccionable?
- 13. ¿Es posible usar un ActionLink que contenga un elemento?
- 14. ¿Es posible hacer referencia directa a una tabla de muchos a muchos utilizando el marco de entidades, primero el código
- 15. bucle foreach para iterar a través de dos listas
- 16. DataTable - foreach Fila, EXCEPTO PRIMERO UNO
- 17. ¿Es posible alterar un registro en rieles, sin leerlo primero?
- 18. ¿Es posible iterar un cursor mongo dos veces?
- 19. expresión lambda utilizando Foreach Cláusula
- 20. ¿Se puede aplicar un efecto de desplazamiento de CSS a un elemento que no sea secundario del elemento de desplazamiento?
- 21. ¿Es posible hacer referencia a una columna que no sea 'id' para JoinColumn?
- 22. ¿Es posible ordenar matrices utilizando el preprocesador?
- 23. En PHP, ¿es posible inspeccionar el contenido de un archivo Zip sin extraer primero su contenido?
- 24. ¿Se puede iterar sobre cada valor de enum posible usando un ciclo de Qt foreach?
- 25. C# - ¿Es posible Iterar GC Heap?
- 26. ¿Es posible hacer que Oauth sea seguro en iOS?
- 27. ¿Es posible que el elemento secundario de un conjunto div sea puntero-eventos: ninguno para tener eventos de puntero?
- 28. El elemento especificado ya es el elemento lógico de otro elemento. Desconectar primero
- 29. ¿Es posible Observable.Buffer en otra cosa que no sea el tiempo
- 30. ¿Es posible obtener un selector utilizando indexOf
Seguiría el principio de menos asombro: http://en.wikipedia.org/wiki/Principle_of_least_astonishment – ChaosPandion
Si no comienza desde el primer elemento, ¿cómo define el comportamiento del iterador? ¿Qué pasa cuando llega al final de la secuencia? ¿Luego regresa al primer elemento e itera sobre los elementos restantes? –
El comentario de @ ChaosPandion es a dónde iba con esas preguntas. :) –