web-dev-qa-db-fra.com

Est-il possible de commencer à itérer à partir d'un élément autre que le premier utilisant foreach?

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 commence chaque élément. Est-il possible de changer en quelque sorte l'élément à partir duquel foreach commence?

74
inferno

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 spécifié en commençant à l'index en cours. D'un autre côté, si vous vouliez utiliser niquement 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 pouvez le faire:

foreach (string curString in myCollection.Skip(3).Take(3))
137
MoarCodePlz

Pour cela, il est plus simple d'utiliser la méthode Skip dans LINQ to Objects, pour ignorer un certain nombre 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 renvoyés.

Vous pouvez en savoir plus sur ces deux méthodes (et sur les méthodes SkipWhile et TakeWhile) associées dans ma série de blogs Edulinq .

19
Jon Skeet

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 souhaiterez peut-être fournir un membre sur l'élément d'arbre lui-même qui renverra un nouveau IEnumerable<T> qui énumérera à partir de là-bas. Cela serait potentiellement plus utile à long terme.

5
Reed Copsey