Je pense à implémenter IEnumerable pour ma collection personnalisée (un arbre) afin que je puisse utiliser foreach pour parcourir mon arbre. Cependant, pour autant que je sache, foreach commence toujours par le premier élément de la collection. Je voudrais choisir à partir de quel élément pourchaque commence. Est-il possible de changer en quelque sorte l'élément à partir duquel foreach commence?
c#
iterator
ienumerable
enfer
la source
la source
Réponses:
Oui. Procédez comme suit:
Collection<string> myCollection = new Collection<string>; foreach (string curString in myCollection.Skip(3)) //Dostuff
Skip
est une fonction IEnumerable qui ignore le nombre que vous spécifiez à partir de l'index actuel. D'un autre côté, si vous vouliez n'utiliser que les trois premiers, vous utiliseriez.Take
:foreach (string curString in myCollection.Take(3))
Ceux-ci peuvent même être jumelés, donc si vous ne vouliez que les 4-6 éléments, vous pourriez faire:
foreach (string curString in myCollection.Skip(3).Take(3))
la source
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"; }
Il est plus simple d'utiliser la
Skip
méthode dans LINQ to Objects pour cela, pour ignorer un nombre donné d'éléments:foreach (var value in sequence.Skip(1)) // Skips just one value { ... }
Évidemment, changez simplement 1 pour toute autre valeur pour ignorer un nombre différent d'éléments ...
De même, vous pouvez utiliser
Take
pour limiter le nombre d'éléments qui sont retournés.Vous pouvez en savoir plus sur ces deux (et les méthodes
SkipWhile
etTakeWhile
méthodes associées ) dans ma série de blogs Edulinq .la source
sequence
peut légitimement l'êtrenull
ou non. Vraisemblablement, l'OP peut gérer cela eux-mêmes - cela ne fait pas vraiment partie de la question ...Vous pouvez utiliser Enumerable.Skip pour ignorer certains éléments et le faire commencer là.
Par exemple:
foreach(item in theTree.Skip(9)) // Skips the first 9 items { // Do something
Cependant, si vous écrivez un arbre, vous voudrez peut-être fournir un membre sur l'élément d'arborescence lui-même qui renverra un nouveau
IEnumerable<T>
qui énumérera à partir de là. Cela serait potentiellement plus utile à long terme.la source
IEnumerable<T> SubTree(rootIndex)
? Bon appel!IEnumerable<MyTreeElement> Children
donc vous pouvez simplement faire:foreach(var item in someElement.Children)
- beaucoup plus clair que l'utilisation des méthodes d'extension IMO.Foreach
itérera sur votre collection de la manière définie par votre implémentation deIEnumerable
. Ainsi, bien que vous puissiez ignorer des éléments (comme suggéré ci-dessus), vous continuez techniquement à parcourir les éléments dans le même ordre.Vous ne savez pas ce que vous essayez d'accomplir, mais votre classe peut avoir plusieurs
IEnumerable
propriétés, chacune énumérant les éléments dans un ordre spécifique.la source
Si vous souhaitez ignorer la lecture des lignes dans un
DataGridView
, essayez ceciforeach (DataGridViewRow row in dataGridView1.Rows.Cast<DataGridViewRow().Skip(3))
Si vous souhaitez copier le contenu de l'une
DataGridView
vers une autre en sautant des lignes, essayez ceci,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; }
cela copie le contenu de l'un
DataGridView
à l'autre en sautant 3 lignes.la source
DataGridView
du tout (ni même un cadre d'interface utilisateur).