78 votes

Est-il possible de faire pour chaque et de ne pas partir du premier élément de la collection

Je songe à implémenter IEnumerable pour ma collection personnalisée (c'est en fait un arbre. Grâce à cela, je pourrais utiliser foreach pour parcourir mon arbre. Toutefois, pour autant que je sache, chaque itération est toujours à partir du premier élément de la collection, est-il possible Pour changer quelque chose à partir duquel chacun commence, ce que je voudrais faire, c’est avoir la possibilité de choisir l’élément à partir duquel chaque personne commence - est-ce possible?

144voto

MoarCodePlz Points 2045

Oui. Faire ce qui suit

 Collection<string> myCollection = new Collection<string>;

foreach (string curString in myCollection.Skip(3))
    //Dostuff
 

skip est une fonction Ienumerable qui ignore quel que soit le nombre spécifié à partir de l'index en cours. D'autre part, si vous vouliez utiliser UNIQUEMENT les trois premiers, vous utiliseriez .take

 foreach (string curString in myCollection.Take(3))
 

et ceux-ci peuvent même être jumelés ensemble, donc si vous vouliez seulement les 4-6 articles que vous pourriez faire

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

Meilleures salutations,

21voto

Jon Skeet Points 692016

Il est plus facile d'utiliser l' Skip méthode de LINQ to Objects pour cela, pour passer d'un nombre donné d'éléments:

foreach (var value in sequence.Skip(1)) // Skips just one value
{
    ...
}

Bien sûr, tout changement 1 pour toute autre valeur de sauter un nombre différent d'éléments...

De même, vous pouvez utiliser Take afin de limiter le nombre d'éléments qui sont retournés.

Vous pouvez lire plus au sujet de ces deux (et l' SkipWhile et TakeWhile méthodes) dans mon Edulinq blog de la série.

5voto

Reed Copsey Points 315315

Vous pouvez utiliser Enumerable.Skip pour ignorer certains éléments et le faire commencer ici.

Par exemple:

 foreach(item in theTree.Skip(9))  // Skips the first 9 items
{
    // Do something
 

Toutefois, si vous écrivez une arborescence, vous souhaiterez peut-être fournir un membre sur l'élément d'arborescence lui-même qui renverra un nouveau IEnumerable<T> qui sera énuméré à partir de là. Ce serait potentiellement plus utile à long terme.

-1voto

Rob Points 1327

Foreach va parcourir votre collection de la manière définie par votre implémentation de IEnumerable . Par conséquent, même si vous pouvez ignorer des éléments (comme suggéré ci-dessus), vous continuez techniquement à les parcourir dans le même ordre.

Vous ne savez pas exactement ce que vous essayez d'atteindre, mais votre classe pourrait avoir plusieurs propriétés IEnumerable , chacune d'elles énumérant les éléments dans un ordre spécifique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X