Comment puis-je supprimer l'élément de place spécifique dans le dictionnaire en C #?

StackOverflow https://stackoverflow.com/questions/1846801

  •  12-09-2019
  •  | 
  •  

Question

J'ai une base de données « Dictionnaire » et je veux retourner un élément à partir d'un emplacement spécifique. J'ai vu qu'il ya fonction « ElementAt » mais je na pas réussi à l'utiliser.

Pourquoi quelque chose ne marche pas comme ça marche?

closeHash.ElementAt<State>(i);

il me dit l'erreur suivante:

Erreur 3 « System.Collections.Generic.Dictionary » ne contient pas de définition de « ElementAt » et la meilleure méthode surcharge « System.Linq.Queryable.ElementAt (System.Linq.IQueryable, int) » extension a une invalide arguments

Et ce code aussi parce que le travail ne marche pas closeHash [i] me donne seulement l'index et non l'élément réel:

   if (closeHash.ContainsKey(i) && ((State)closeHash[i]).getH() + 
((State)closeHash[i]).getG() > checkState.getH() + checkState.getG()

Chaque élément du dictionnaire est d'une classe « Etat » et checkState est également un Etat qui a des fonctions Geth et GetG. Je veux sortir l'élément à la position Ith et travailler et ne pas supprimer tout simplement.

Merci d'avance!

Greg

Était-ce utile?

La solution

Utilisation du dictionnaire dans les collections génériques, vous ne devriez jamais avoir à utiliser un RemoveAt (). Les valeurs clés dans un dictionnaire doit être unique.

//       Unique Not Unique
//          |     |   
Dictionary<int, string> alphabet = new Dictionary<int, string>();
alphabet.Add(1, "A");
//Adding this will cause an Argument Exception to be thrown
//The message will be: An item with the same key has already been added.
alphabet.Add(1, "A");

Si je voulais supprimer un élément avec la clé 24 de mon exemple alphabet, ce que je aurais besoin:

alphabet.Remove(24)

Cela fonctionne parce qu'il n'y aura jamais 2 clés avec la même valeur.

Maintenant, si vous voulez supprimer un élément avec en sachant qu'il est essentiel, qui est une autre histoire. Vous auriez besoin de passer par tous les éléments et essayer de trouver la clé qui lui est associée. J'utiliser LINQ, un peu comme ceci:

var key = (from item in alphabet
             where item.Value == "K"
             select item.Key).FirstOrDefault();
//Checking to make sure key is not null here
...
//Now remove the key
alphabet.Remove(key)

Les deux façons, il n'y a jamais une raison, que je peux voir, avoir besoin RemoveAt (index) de toute liste où les valeurs clés doivent être uniques.

Autres conseils

Que diriez-vous d'utiliser la fonction Supprimer et passer dans le ElementAt?

        Dictionary<int, string> closeHash = new Dictionary<int, string>();
        closeHash.Add(47, "Hello");
        closeHash.Remove(closeHash.ElementAt(0).Key);

Je suis sûr que vous pouvez le faire en quelque sorte, mais les collections de type table de hachage ne travaille pas habituellement sur le concept de « l'ordre ». En Java, vous pourriez obtenir un recenseur ou Iterator et enlever le n-ième élément que vous rencontriez, mais encore une fois, je ne pense pas que ce soit significatif.

Vous avez juste besoin d'utiliser System.Linq pour être en mesure d'utiliser la méthode d'extension ElementAt <>. Inclure cela au début de la déclaration de classe:

using System.Linq;

Et cela devrait faire l'affaire.

Les impleas message d'erreur que votre closeHash variable est un dictionnaire, apparemment un dictionnaire < "type de i", État>. Dans le cas contraire, s'il vous plaît préciser la déclaration exacte du dictionnaire et « i ».

Alors closeHash [i] devrait donner une valeur de type État, de sorte que vous n'avez pas besoin de jeter.

Comme d'autres l'ont dit, un dictionnaire n'a pas de concept d ' « ordre » et donc pas d'un « n-ième élément ».

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top