2009-11-30 6 views
37

J'utilise un System.Collections.Generic.Dictionary<string, string>.Récupère la première clé du dictionnaire <chaîne, chaîne>

Je veux retourner la première clé de ce dictionnaire. J'ai essayé dic.Keys[0] mais la seule chose que j'ai sur la propriété Keys (qui est un objet KeyCollection) est un énumérateur.

Dois-je énumérer toutes les clés pour obtenir la première?

+0

comme beaucoup d'entre vous ont dit, il n'y a « première ». Je devais me rendre un peu plus clair: vous pouvez spécifier une région dans une chaîne de requête, et je vérifie si elle est dans ma liste de registres. si ce n'est pas le cas (l'utilisateur édite la chaîne de requête), je le place juste dans la première région connue. – Michel

+0

Copie possible de [Obtenir le premier élément d'un dictionnaire] (http://stackoverflow.com/questions/13979966/get-first-element-from-a-dictionary) –

+0

@MichaelFreidgeim Cela pourrait être un doublon, mais cette question était demandé 3 ans auparavant, donc il ne pouvait pas vraiment être un doublon alors. – Michel

Répondre

83

En supposant que vous utilisez .NET 3.5:

dic.Keys.First(); 

Notez qu'il n'y a pas d'ordre précis dans lequel les paires clé/valeur itérer sur dans un dictionnaire. Vous pouvez bien trouver que dans lots de cas, vous sortez la première clé que vous mettez dans les dictionnaires - mais vous absolument ne doit pas compter sur cela. Comme le dit Skirwan, il n'y a pas vraiment de notion de «premier». Essentiellement ce qui précède vous donnera "une clé du dictionnaire" - c'est à peu près tout ce qui est garanti.

(Si vous ne savez pas si le dictionnaire est vide ou non, vous pouvez utiliser FirstOrDefault.)

+0

gentil, ne l'a pas vu dans intellisense donc je pensais que c'était un objet non-linq-able (paresseux moi :) – Michel

+2

comment voulez-vous faire cela dans .NET 2 et plus tôt – ina

+0

@ina: Vous pouvez facilement écrire une méthode 'First()' vous-même, qui utilise simplement 'foreach' avec une instruction return. Mais je vous encourage fortement à mettre à niveau si at * all * possible ... la différence de productivité lorsque vous avez LINQ disponible est énorme ... –

9

semble un peu plus haut, mais que diriez-vous

foreach (<Type> k in dic.Keys) 
    return k; 
22

L'idée de « première » ne concerne pas vraiment un dictionnaire, car il n'y a pas de commande sur les entrées; tout insert ou supprimer est autorisé à changer radicalement l'ordre des clés.

+3

+1 pour corriger. La commande dans un dictionnaire n'est pas garantie. Peut-être qu'un SortedDictionary serait plus utile. –

+0

idem dito ---------- (au moins 15 caractères) – Michel

11

Tout d'abord, non, vous n'avez pas d'énumérer toutes les entrées - il suffit d'énumérer le premier élément: Idéalement, on vérifierait que MoveNext() a effectivement réussi (il renvoie un booléen) sinon l'appel à Current pourrait être lancé.

Veuillez également noter que l'ordre d'un dicitonary n'est pas spécifié. Cela signifie que le 'premier' élément peut en fait être n'importe quelle touche, peut être différent sur les appels suivants (mais pas dans la pratique) et va certainement changer au fur et à mesure que des éléments sont ajoutés et supprimés du dictionnaire.

+0

+1 pour l'explication de la commande – Michel

2

nous pouvons en utilisant la technologie linq

var key = dic.Take(1).Select(d => d.Key).First() 

ou nous pouvons utiliser une autre recherche

var myList = dic.Take(1).Where(d => d.Key.Contains("Heaven")).ToList(); 
Questions connexes