Obtenir le dernier élément dans un dictionnaire?
Mon dictionnaire:
Dictionary<double, string> dic = new Dictionary<double, string>();
Comment puis-je retourner le dernier élément dans mon dictionnaire?
- définir dernier élément: la dernière inséré? dernière triés élément?
- Je suis en supposant que la dernière inséré.
- dernier élément inséré
- C'est drôle de voir comment beaucoup de upvotes il y a pour les réponses incorrectes!
- des subprimes, consultez mon post, je voudrais mentionner les OrderedDictionary classe de collection - c'est probablement votre meilleur pari. Normal dictionnaires ne conserve pas l'ordre d'insertion de l'information.
- c'est pourquoi je vous recommande de créer une classe wrapper.
- RichardOD de la classe wrapper semble être sur place.
Vous devez vous connecter pour publier un commentaire.
Qu'entendez-vous par ce Dernier? Entendez-vous la Dernière valeur ajoutée?
La
Dictionary<TKey,TValue>
classe est une collection non ordonnée. Ajout et suppression d'éléments peut changer ce qui est considéré comme le premier et le dernier élément. Donc il n'y a aucun moyen d'obtenir le Dernier élément ajouté.Il y a un ordre de classe de dictionnaire disponible sous la forme de
SortedDictionary<TKey,TValue>
. Mais cela va être classées en fonction de la comparaison des touches et non pas l'ordre dans lequel les valeurs ont été ajoutées.MODIFIER
Plusieurs personnes ont signalé à l'aide de la suite de LINQ approche de style
Être très prudent sur l'utilisation de cette méthode. Il renvoie la dernière valeur dans les Valeurs de la collection. Cela peut ou peut ne pas être la dernière valeur que vous avez ajoutés au Dictionnaire. Il est probablement plus susceptibles de ne pas être comme il est.
Les dictionnaires sont des collections non triées, en tant que tel, il n'y a pas de concept d'un premier ou le dernier élément. Si vous êtes à la recherche pour une classe qui se comporte comme un dictionnaire, mais elle conserve l'ordre d'insertion des éléments, pensez à utiliser
OrderedDictionary
.Si vous êtes à la recherche pour une collection qui trie les éléments, pensez à utiliser
SortedDictionary<TKey,TValue>
.Si vous disposez d'un dictionnaire, et que vous êtes à la recherche pour le "dernier" élément donné une sorte de commande, vous pouvez utiliser linq pour le tri de la collecte, quelque chose comme:
Par méfier de l'utilisation de
Dictionary.Keys.Last()
- alors que la clé de la liste est triée en utilisant la valeur par défautIComparer
pour le type de la clé, la valeur que vous obtenez peut-être pas la valeur que vous attendez.Je sais que cette question est trop vieux pour obtenir toutes les upvotes, mais je n'aimais pas les réponses seront donc après mes propres dans l'espoir d'offrir une autre option pour les futurs lecteurs.
Suivantes n'a pas de travail pour moi .NET 4.0:
Je soupçonne que le problème est que le " x " représente une valeur dans le dictionnaire, et une valeur n'a pas de clé (le dictionnaire stocke la clé, le dictionnaire des valeurs ne sont pas). J'ai peut-être aussi faire une erreur dans mon utilisation de la technique.
De toute façon, cette solution serait lente pour les grands dictionnaires, probablement O(n log n) pour CS gens, parce que c'est de tri de l'ensemble du dictionnaire juste pour obtenir une entrée. C'est comme de réorganiser l'ensemble de votre collection de DVD juste pour trouver un film spécifique.
est bien établi comme une mauvaise idée. Dans la pratique, cette solution ne fait de travailler la plupart du temps dû à l'implémentation Microsoft du dictionnaire, mais en génie logiciel en des termes qui n'a de sens et ne doit pas être invoqué. Même si il travaille tout le temps pour le reste de l'éternité, il représente une bâclée, de mauvaises pratiques de codage.
Ma solution est la suivante:
Les Touches.max() la fonction est beaucoup plus rapide que le tri O(n) au lieu de O(n log n).
Si la performance est assez important pour que même O(n) est trop lent, la dernière inséré la clé peuvent être suivis dans une autre variable utilisée pour remplacer dic.Les touches.Max(), qui permettra à l'ensemble de la recherche O(1), plus les frais généraux existe dans le suivi de la dernière inséré entrée.
Si vous êtes en utilisant .NET 3.5, regardez:
Si vous voulez un ordre prévisible, cependant, utiliser:
Au lieu d'utiliser:
...vous pouvez utiliser:
Cela vous permettra d'utiliser l'indexeur pour accéder à l'élément de commande au lieu de la clé.
Envisager la création d'une collection personnalisée qui contient une référence dans le
Add
méthode de la collection personnalisée. Ce serait un champ privé contenant les dernières ajouté clé/valeur(ou les deux) en fonction de vos besoins.Alors un
Last()
méthode qui retourne cette. Voici une preuve de concept de classe pour montrer ce que je veux dire (merci de ne pas frapper le manque de l'implémentation de l'interface etc - c'est l'exemple de code):De la docs:
Donc, je ne pense pas que vous pouvez compter sur
Dictionary
pour revenir au dernier élément.Utiliser une autre collection. Peut-être
SortedDictionary
...Si vous voulez juste la valeur, cela devrait fonctionner (en supposant que vous pouvez utiliser LINQ):
Vous pouvez utiliser:
Mais un dictionnaire n'a pas vraiment d'avoir un dernier élément (les paires à l'intérieur ne sont pas classées dans un sens particulier). Le dernier élément sera toujours le même, mais il n'est pas évident de l'élément dont il pourrait être.
Avec .Net 3.5:
...mais gardez à l'esprit qu'un dictionnaire n'est pas ordonné, de sorte que vous ne pouvez pas compter sur le fait que les valeurs restent dans le même ordre.
Un dictionnaire n'est pas destiné à être consulté dans l'ordre, donc, premier, dernier, n'ont pas de sens. Voulez-vous la valeur indexée par la clé la plus élevée?
Au lieu de l'utilisation de Linq comme la plupart des autres réponses suggèrent, vous pouvez accéder au dernier élément de la Collecte de l'objet via la propriété Count (voir ICollection.Propriété Count pour plus d'informations).
Voir le code ici pour un exemple de la façon d'utiliser le comte d'accéder à l'élément final de toute Collecte (y compris un Dictionnaire):
Garder à l'esprit qu'il retourne la dernière VALEUR, pas la clé.