Estou pensando em implementar IEnumerable para minha coleção personalizada (uma árvore) para que eu possa usar foreach para cruzar minha árvore. No entanto, pelo que eu sei, foreach sempre começa a partir do primeiro elemento da coleção. Eu gostaria de escolher qual elemento foreach começa. É possível alterar de alguma forma o elemento a partir do qual o foreach começa?
c#
iterator
ienumerable
inferno
fonte
fonte
Respostas:
Sim. Faça o seguinte:
Collection<string> myCollection = new Collection<string>; foreach (string curString in myCollection.Skip(3)) //Dostuff
Skip
é uma função IEnumerable que ignora quantas funções você especificar a partir do índice atual. Por outro lado, se você quiser usar apenas os três primeiros, deve usar.Take
:foreach (string curString in myCollection.Take(3))
Eles podem até mesmo ser emparelhados, então se você quisesse apenas os 4 a 6 itens, você poderia fazer:
foreach (string curString in myCollection.Skip(3).Take(3))
fonte
foreach(List<string> row in rows.skip(1)){ row[0] = "newInfo"; }
for(int i=1; i<rows.Count;i++){ List<string> row = rows[i]; row[0] = "newStuff"; }
É mais fácil usar o
Skip
método em LINQ to Objects para isso, para pular um determinado número de elementos:foreach (var value in sequence.Skip(1)) // Skips just one value { ... }
Obviamente, basta alterar 1 para qualquer outro valor para pular um número diferente de elementos ...
Da mesma forma, você pode usar
Take
para limitar o número de elementos que são retornados.Você pode ler mais sobre ambos (e os métodos
SkipWhile
eTakeWhile
métodos relacionados ) em minha série de blogs Edulinq .fonte
sequence
pode ser legitimamentenull
ou não. Presumivelmente, o OP pode cuidar disso sozinho - não é realmente parte da questão ...Você pode usar Enumerable.Skip para pular alguns elementos e fazer com que comece aí.
Por exemplo:
foreach(item in theTree.Skip(9)) // Skips the first 9 items { // Do something
No entanto, se você estiver escrevendo uma árvore, você pode querer fornecer um membro no próprio item da árvore que retornará um novo
IEnumerable<T>
que será enumerado a partir daí. Isso seria, potencialmente, mais útil no longo prazo.fonte
IEnumerable<T> SubTree(rootIndex)
? Boa decisão!IEnumerable<MyTreeElement> Children
então você poderia apenas fazer:foreach(var item in someElement.Children)
- muito mais claro do que usar métodos de extensão IMO.Foreach
irá iterar em sua coleção da maneira definida por sua implementação deIEnumerable
. Portanto, embora você possa pular elementos (como sugerido acima), você ainda está tecnicamente iterando sobre os elementos na mesma ordem.Não tenho certeza do que você está tentando alcançar, mas sua classe pode ter várias
IEnumerable
propriedades, cada uma das quais enumera os elementos em uma ordem específica.fonte
Se você quiser pular a leitura das linhas em a
DataGridView
, tente esteforeach (DataGridViewRow row in dataGridView1.Rows.Cast<DataGridViewRow().Skip(3))
Se você quiser copiar o conteúdo de um
DataGridView
para outro pulando linhas, tente isto,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; }
isso copia o conteúdo de um
DataGridView
para outro, saltando 3 linhas.fonte
DataGridView
nada (ou mesmo uma estrutura de IU).