9
votes

Itérer sur les clés du dictionnaire C # avec index?

Comment puis-je itération sur les touches de dictionnaire tout en maintenant l'index de la clé. Ce que j'ai fait, c'est fusionner un foreach code> -loop avec une variable locale i code> qui est incrémentée par une pour chaque tour de la boucle.

Voici mon code qui fonctionne : P>

public IterateOverMyDict()
{
    int i=-1;
    foreach (string key in myDict.Keys)
    {
        i++;
        Console.Write(i.ToString() + " : " + key);
    }
}


1 commentaires

5 Réponses :


26
votes

Il n'y a pas de concept de ce type comme "l'index de la clé". Vous devez toujours traiter un dictionnaire Code> comme ayant une commande imprévisible - où la commande que vous se produise em> pour obtenir lors de l'itération. (Ainsi, en théorie, vous pouvez ajouter une nouvelle entrée et les entrées pourraient être dans un ordre complètement différent de la prochaine fois que vous avez itéré sur eux. En théorie, cela pourrait même arriver sans em> vous modifiez les données, mais c'est moins probable dans des implémentations normales.)

Si vous vraiment em> veux obtenir l'index numérique que vous avez arrivé à observer cette fois, vous pouvez utiliser: p> xxx pré>

... Mais soyez conscient que c'est un affichage assez trompeur, car il suggère un ordre inhérent. P>

de la Documentation : P>

Aux fins de l'énumération, chaque élément du dictionnaire est traité comme un KeyValuePair CODE> Structure représentant une valeur et sa clé. L'ordre dans lequel les articles sont retournés est indéfini. P> blockQuote>

Edit: Si vous n'aimez pas le CODE> SELECT CODE> Appelez ici, vous Pourriez-vous créer votre propre méthode d'extension: P>

foreach (var x in dictionary.WithIndex())
{
    Console.WriteLine("{0}: {1} = {2}", x.Index, x.Value.Key, x.Value.Value);
}


4 commentaires

L'ordre n'a pas d'importance pour moi et je n'ai pas besoin du TVALUE pour le moment, j'ai juste besoin d'imprimer les clés avec une sorte d'index devant eux afin que l'utilisateur puisse alors taper < Code> Sélectionnez 1 et il sélectionnera la touche avec l'index de 1 (la touche avec 1 devant celui-ci dans la version imprimée, c'est-à-dire.)


@MarkusmesKanen: Alors pourquoi avez-vous posé une question de "tout en maintenant l'index de la clé"? Quoi qu'il en soit, la requête Linq que j'ai montré que vous devriez vous aider.


Toutes mes excuses pour ne pas parler anglais comme langue maternelle, je ne sais pas comment dois-je demander si ce n'est pas assez clair. : / Toutefois, c'est pourquoi je t'ai donné le code que j'utilise ATM, comme exemple pour montrer que je n'utilise pas TValue du tout et je n'imprime que la clé et un int en face de celui-ci. Et avec tout le respect, que Linq a l'air terrible et je préférerais utiliser ma propre solution, merci pour votre réponse :)


@MarkusmesKanen: Il suffit d'expliquer que vous saviez que la commande était instable (et pourquoi vous voulez un tel écran trompeur) aurait été utile. Je ne vois pas ce qui ne va pas avec le Linq - étant donné que vous devez obtenir une valeur supplémentaire de quelque part, quelle autre solution auriez-vous attendu? (Vous pouvez écrire une méthode pour "index" toute séquence , mais via une structure personnalisée, je suppose ...)



3
votes

Techniquement, la clé est l'index dans un dictionnaire . Vous n'êtes pas garanti d'obtenir les éléments dans un ordre spécifique, il n'y a donc vraiment aucun indice numérique à appliquer.


1 commentaires

Je n'ai pas besoin d'eux dans un ordre spécifique, j'ai juste besoin de itérer à travers les clés et imprimez-les avec un int de 1 à la touche.Count devant eux



1
votes

Pas vraiment. Notez que les clés dans un dictionnaire ne sont pas logiquement "commandées". Ils n'ont pas d'index. Il n'y a pas de première clé ou de dernière clé, du point de vue du dictionnaire. Vous pouvez garder une trace vous-même s'il s'agit de la première clé renvoyée par l'énumérateur, comme vous le faites, mais le dictionnaire n'a aucun concept de «Donnez-moi la 5ème clé», vous ne pouviez donc pas utiliser de pour < / code> boucle avec un indexeur comme vous le pouviez avec une liste ou une matrice.


0 commentaires

0
votes

Les dictionnaires ne sont pas exactement des listes, des tableaux ou des vecteurs. Ils prennent ces constructions un pas plus loin. La clé peut être l'index: xxx

à ce stade que vous manquez probablement la plupart des avantages d'un dictionnaire (qui est similaire à l'énumération avec le tri rapide des valeurs clés) et en l'utilisant comme une liste.


0 commentaires

-1
votes

Le SELECT ((entrée, index) => Nouvelle {entrée, index}) est probablement préférable dans le contexte spécifique de cette question, mais, comme une alternative, System.Linq.Enumérable vous permet de convertir un dictionnaire en une liste. Quelque chose comme ça fonctionnerait:

var x = dictionary.ToList();
for (int y=0; y<x.Count; y++) Console.WriteLine(y + " = " + x[y].Key);


0 commentaires