Estoy pensando en implementar IEnumerable para mi colección personalizada (un árbol) para poder usar foreach para atravesar mi árbol. Sin embargo, hasta donde yo sé, foreach siempre comienza desde el primer elemento de la colección. Me gustaría elegir desde qué elemento comienza cada uno. ¿Es posible cambiar de alguna manera el elemento desde el que comienza foreach?
c#
iterator
ienumerable
infierno
fuente
fuente
Respuestas:
Si. Haz lo siguiente:
Collection<string> myCollection = new Collection<string>; foreach (string curString in myCollection.Skip(3)) //Dostuff
Skip
es una función IEnumerable que omite la cantidad que especifique a partir del índice actual. Por otro lado, si quisiera usar solo los primeros tres, usaría.Take
:foreach (string curString in myCollection.Take(3))
Estos incluso se pueden emparejar, por lo que si solo desea los 4-6 elementos, puede hacer:
foreach (string curString in myCollection.Skip(3).Take(3))
fuente
foreach(List<string> row in rows.skip(1)){ row[0] = "newInfo"; }
vsfor(int i=1; i<rows.Count;i++){ List<string> row = rows[i]; row[0] = "newStuff"; }
Es más fácil usar el
Skip
método en LINQ to Objects para esto, para omitir una cantidad determinada de elementos:foreach (var value in sequence.Skip(1)) // Skips just one value { ... }
Obviamente, solo cambie 1 por cualquier otro valor para omitir un número diferente de elementos ...
Del mismo modo, puede utilizar
Take
para limitar el número de elementos que se devuelven.Puede leer más sobre ambos (y el relacionado
SkipWhile
yTakeWhile
métodos) en mi blog, Edulinq serie .fuente
sequence
puede ser legítimamentenull
o no. Presumiblemente, el OP puede manejar eso por sí mismo, no es realmente parte de la pregunta ...Puede usar Enumerable.Skip para omitir algunos elementos y hacer que comience allí.
Por ejemplo:
foreach(item in theTree.Skip(9)) // Skips the first 9 items { // Do something
Sin embargo, si está escribiendo un árbol, es posible que desee proporcionar un miembro en el elemento del árbol en sí que devolverá un nuevo
IEnumerable<T>
que se enumerará desde allí hacia abajo. Esto, potencialmente, sería más útil a largo plazo.fuente
IEnumerable<T> SubTree(rootIndex)
? ¡Buena llamada!IEnumerable<MyTreeElement> Children
por lo que podría hacer:foreach(var item in someElement.Children)
- mucho más claro que usar métodos de extensión en mi opinión.Foreach
iterará sobre su colección de la manera definida por su implementación deIEnumerable
. Entonces, aunque puede omitir elementos (como se sugirió anteriormente), técnicamente aún está iterando sobre los elementos en el mismo orden.No estoy seguro de lo que está tratando de lograr, pero su clase podría tener varias
IEnumerable
propiedades, cada una de las cuales enumera los elementos en un orden específico.fuente
Si desea omitir la lectura de filas en a
DataGridView
, intente estoforeach (DataGridViewRow row in dataGridView1.Rows.Cast<DataGridViewRow().Skip(3))
Si desea copiar el contenido de uno
DataGridView
a otro saltando filas, intente esto,foreach (DataGridViewRow row in dataGridView1.Rows.Cast<DataGridViewRow>().Skip(3)) { foreach (DataGridViewCell cell in row.Cells) { string value = cell.Value.ToString(); dataGridView2.Rows[i].Cells[j].Value = cell.Value.ToString(); j++; } i++; j = 0; }
esto copia el contenido de uno
DataGridView
a otro saltando 3 filas.fuente
DataGridView
en absoluto (o incluso un marco de interfaz de usuario).