Comment puis-je savoir si je suis une itération sur le dernier élément de la collection?
Je veux faire quelque chose de différent sur la dernière KeyValuePair
de la Dictionary
je suis une itération sur.
For Each item In collection
If ItsTheLastItem
DoX()
Else
DoY()
End If
Next
Est-ce possible?
Re-Edit: je ne suis pas à l'aide d'un Dictionnaire de valeurs, je suis en fait à l'aide d'une Liste de KeyValuePair
s. J'ai converti et n'ai pas d'avis plus tard, idiot moi.
double possible de boucle Foreach, de déterminer qui est la dernière itération de la boucle
OriginalL'auteur Camilo Martin | 2010-12-26
Vous devez vous connecter pour publier un commentaire.
Convertir la collecte d'une liste (comme LINQ ToList()) et de réitérer avec un for(int i = 0)... en boucle.
Je l'ai fait sans m'en apercevoir avant dans le code de l'écoulement. Cependant, maintenant je peux le faire même avec un
For Each
, qui est sémantiquement plus doux à mon humble avis. En d'autres termes, l'a Accepté.OriginalL'auteur fejesjoco
Je voudrais faire votre propre méthode d'extension. Cette mise en œuvre ici vous garantit seulement à pied de la collecte une fois.
Utilisation:
De sortie:
OriginalL'auteur jason
Sauf si vous souhaitez mettre en œuvre la
foreach
vous-même, utilisez un compteur (code C#):Veuillez noter que cela ne fonctionne qu'avec les non-diffusés
IEnumerable<T>
, également, en fonction de la mise en œuvre,Count
serait la cause de la collection à être parcouru à deux reprises.L'Indexeur est fourni par l'interface IList qui hérite de ICollection - certaines collections de mettre en œuvre au plus tard ou IEnumerable, donc pas de indexeur
Non, vous ne pouvez pas faire une telle supposition. Par exemple, vous pouvez effectuer une itération sur un
LinkedList
, mais il n'a pas un tableau en tant que structure de données interne. Concernant votre commentaire sur Jani question - comment obtenez-vous votre collection? Vous dites que c'est en streaming, cette méthode ne marcherait pas tout à fait aussi bien, soit, en fonction de la mise en œuvre deCount
sur le flux de collection.Ouais, c'est ce qu'une boucle for pour. Pourquoi utiliser un compteur dans un foreach?
Parce que vous ne pouvez utiliser qu'un
for
boucle si vous avez un indexeur à portée de main. Si une collection implémente uniquementIEnumerable
, vous n'avez pas l'indexer.OriginalL'auteur Femaref
Pourquoi ne pas utiliser:
OriginalL'auteur Bob Joziasse
Vous ne pouvez pas faire cela, bien sûr, avec un
IEnumerable<T>
que vous ne savez pas si il y a d'autres éléments jusqu'à ce que vous essayez d'obtenir à la prochaine.Cependant, dans mon MiscUtil bibliothèque j'ai quelque chose qui s'appelle
SmartEnumerable
qui se lit d'un seul élément à l'avance, afin de fournir les propriétés suivantes:IsFirst
IsLast
Index
Value
Voir cette page pour les instructions d'utilisation. Par exemple:
Vous auriez besoin d'utiliser
item.Value
pour obtenir la valeur de l'élément courant.Un point sur une itération sur les dictionnaires cependant, elles ne sont pas réellement dans n'importe quel ordre. Ainsi tandis que vous pouvez parcourir et il sera être une première entrée et une dernière entrée, vous ne devriez pas supposer qu'ils vont être la première entrée et la dernière entrée ajoutés respectivement. Qui ne peut pas être un problème pour votre cas d'utilisation, mais vous devriez être conscient de cela.
OriginalL'auteur Jon Skeet
Je viens d'avoir une idée qui n'a pas l'utilisation d'un compteur.
Edit: désolé c'est pour une Liste, j'avais converti avant et intellisense m'a donné la Liste des méthodes à la place de Dictionnaire des méthodes.
OriginalL'auteur Camilo Martin
Une autre approche est de maintenir l'index d'itération et quand frapper le
collection.Length-2
oucollection.Count()-2
puis arrêter la boucle et de faire ce que vous voulez avec le dernier élément.Mais comme @BrokenGlass dit méfiez-vous des effets secondaires qu'il peut sur votre demande.
Et, en général, vous devez utiliser Linq avec un soin particulier.
Par exemple à chaque fois que vous itérer sur une linq to sql collection, vous exécutez à nouveau la requête, de sorte qu'il est beaucoup mieux de le lancer une fois avec impatience en appelant simplement
.ToList()
et de l'utiliser dans la mémoire de collecte autant que vous le souhaitez.Semble bon, mais
Reverse()
n'est pas une fonction (c'est à dire, il ne renvoie pas unList
), c'est donc le code non valide.Ce n'est pas nécessairement une Liste, c'était juste un nom de variable, et je l'ai changé de collection pour plus de clarté. ensuite, vous pouvez le tester et de le supprimer de votre rapide downvote si vous l'avez fait.
Je n'ai pas downvote, je upvoted et de l'onu-upvoted parce qu'il ne veut pas compiler. Je ne peux pas appeler
Skip()
surReverse()
parce queReverse()
n'est pas une fonction qui retourne quelque chose que je peux appelerSkip()
, malheureusement.Alors d'abord, désolé pour ça et puis voici la signature de Sauter et à l'Inverse, "public static IEnumerable<TSource> Skip<TSource>(IEnumerable<TSource> source, int count);" , "public static IEnumerable<TSource> Inverser<TSource>(IEnumerable<TSource>);" ils ont tous accepter un IEnumerable<> et retour IEnumerable<>. probablement qqch ne va pas dans votre programme.
OriginalL'auteur Jahan Zinedine
J'ai créé un solution pour construire une IP de la Chaîne à partir de 4 octets @CamiloMartin réponse ci-dessus.
OriginalL'auteur Jim Lahman
Avec un Dictionnaire, vous avez plusieurs options
Je vous suggère de itterate sur le ValueCollection et utiliser un compteur ou ne a est Égal à la comparaison entre le courant et le dernier article (qui sera probablement plus lent, mais vous vous enregistrez une variable de compteur 😉
N'oubliez pas d'ajouter une case de la liste vide.
OriginalL'auteur Jürgen Steinblock