2010-08-23 3 views
0

Veuillez comparer ces deux codes. Je ne peux pas comprendre pourquoi l'ancien ne travaillait pas alors que le dernier fonctionnait parfaitement.C# Objet en tant que problème clé du dictionnaire

// With loop - not work 
for (int i = 0; i < 5; i++) 
{ 
    Location l = new Location(); 
    l.Identifier = i.ToString(); 
    _locations.Add(l); 
} 
//// 

Dictionary<Location, Route> _paths = new Dictionary<Location, Route>(); 
foreach (Location loc in _locations) 
{ 
    _paths.Add(loc, new Route(loc.Identifier)); 
} 

Location start = new Location(); 
start.Identifier = "1"; 
_paths[start].Cost = 0;  //raised Key not exists error 

Voici version de travail ...

// Without Loop - it work 
Location l1 = new Location(); 
l1.Identifier = "1"; 
_locations.Add(l1); 

Location l2 = new Location(); 
l2.Identifier = "2"; 
_locations.Add(l2); 

Location l3 = new Location(); 
l3.Identifier = "3"; 
_locations.Add(l3); 
///// 

Dictionary<Location, Route> _paths = new Dictionary<Location, Route>(); 
foreach (Location loc in _locations) 
{ 
    _paths.Add(loc, new Route(loc.Identifier)); 
} 

Location start = new Location(); 
start.Identifier = "1"; 
_paths[start].Cost = 0; 

Toutes les idées? Merci.

Edit: Lieu Indice

public class Location 

{ 
    string _identifier; 
    public Location() 
    { 

    } 

    public string Identifier 
    { 
     get { return this._identifier; } 
     set { this._identifier=value; } 
    } 

    public override string ToString() 
    { 
     return _identifier; 
    } 
} 
+0

Vous devriez également publier votre classe Location, et regardez ici -> http://stackoverflow.com/questions/634826/using-an-object-as-a-generic-dictionary-key-in-net ;) – digEmAll

+0

Cest juste ... Vous devez également publier la classe Location. Le membre Identifiant de la classe Location est-il une chaîne ou quelque chose d'autre? – Shekhar

+0

@digEmAll - Merci pour le lien. Cela a résolu mon problème. –

Répondre

3

Ni devrait fonctionner à moins que vous substituez Equals et GetHashCode dans votre Location classe afin que la Dictionary correspond Location objets clés basés sur l'égalité de leur identifiant plutôt que l'égalité de l'objet.

0

Est-ce que la classe Emplacement GetHashCode mettre en œuvre? Si ce n'est pas le cas, remplacez-le et assurez-vous qu'il renvoie un entier unique pour chaque instance.

+0

Merci pour vos conseils. Implémenté GetHashCode et égal à. C'est du travail maintenant. –

-1

Les deux éléments de code que vous avez mentionnés ne fonctionneront pas. Essayez d'exécuter votre code étiqueté "Version de travail" à nouveau, il devrait lancer la même exception que le premier.

0

En plus de GetHashCode, vous devez remplacer Equals tel qu'il est appelé lorsque les codes de hachage sont signalés égaux, pour conclure l'égalité des objets. Dans l'isolement, les codes de hachage ne peuvent que prouver l'inégalité. Les objets non égaux peuvent avoir des codes de hachage égaux; les codes de hachage égaux ne prouvent pas que les objets sont égaux.

+0

Merci pour vos conseils. Implémenté GetHashCode et égal à. C'est du travail maintenant. –

Questions connexes