2010-10-21 8 views
3

Je suis l'analyse d'un fichier et je voudrais le stocker dans une structure de recherche d'une manière que je peux rechercher avec deux clés.Recherche de clés multiples pour le dictionnaire

J'ai un User Entity qui a name, email et id, les types sont sans importance.

Je voudrais le stocker dans un Dictionary<User, id> afin que je puisse obtenir l'identification d'utilisateur en recherchant avec l'utilisateur.

Je veux aussi dans l'autre sens, à savoir: Dictionary<Id, User>

Je peux créer deux structures et faire la recherche. C'est facile. Je voudrais le faire avec une structure unique.

Je suis curieux de savoir si je peux le faire avec une seule structure

Je pensais que je peux faire:

Dictionary<User, User>, puis mettre en œuvre un IEqualityComparer<User>

Y at-il une meilleure façon de faire ?

Quelle serait la meilleure pratique pour implémenter IEqualityComparer?

+0

Puisque id est une propriété de l'objet User, vous n'avez qu'à utiliser user.id lorsque vous voulez obtenir l'identifiant d'un objet spécifique. Mais je suppose que vous voulez faire l'inverse même si id n'est pas publique? –

+0

Je ne pense pas que vous avez compris ce que j'ai demandé.Je peux stocker l'objet utilisateur en tant que clé, puis je ne peux pas faire la recherche uniquement par ID. – DarthVader

Répondre

1

Que vous ayez besoin de faire ce type de mapping ou non, vous pouvez utiliser un seul dictionnaire pour quelque chose comme ce que vous demandez. Voici un exemple approximatif:

var dict = new Dictionary<string, object>(); 
dict["ID_001"] = new User(); 
dict["USER_??"] = 001; // Need a unique user string to replace the "??" 

Bien sûr, vous pouvez créer n'importe quelle chaîne que vous voulez. Et si vous voulez emballer des fonctions autour de choses, vous pouvez éviter d'avoir à lancer l'objet chaque fois que vous obtenez un objet. (Une méthode statique pourrait fonctionner mieux pour vous.)

User GetUser(int id, Dictionary<string, object> dict) 
{ 
    return (User)dict["ID_" + id]; 
} 
+0

s est intelligent et devrait fonctionner. Que diriez-vous sans coder en dur une chaîne? – DarthVader

+0

@ user177883: Ensuite, vous finiriez avec un objet ** Dictionary ** Cela ne vaudrait probablement pas la peine. –

0

Étant donné que vous stockez l'ID dans l'objet Utilisateur, vous n'avez pas besoin d'un mappage utilisateur-> id.

+0

Oui, je peux le stocker. et c'est là pour ça. – DarthVader

1

Je ne suis pas sûr que votre description du problème est logique, pour la raison suivante:

Étant donné un objet User vous connaissez l'ID, l'ID est une propriété de l'utilisateur. Par conséquent, pourquoi auriez-vous besoin du Dictionary<User, Id>? Si vous avez le Dictionary<Id, User> vous pouvez obtenir à l'utilisateur donné l'Id, et si vous avez l'utilisateur, vous devriez déjà avoir l'ID, ce qui rend l'autre dictionnaire inutile.

Ou est-ce que vous avez parfois un objet Utilisateur incomplet avec l'Id non rempli?

+0

À un certain moment, je connais l'utilisateur {nom et adresse e-mail} mais pas l'identifiant, et à un moment donné, je connais l'identifiant de l'utilisateur mais pas l'utilisateur {nom et adresse e-mail}. logique? – DarthVader

+0

Dans ce cas, il semble que vous ayez besoin de deux dictionnaires: un qui recherche sur l'email (concaténer le nom aussi bien si l'email n'est pas unique) et l'autre qui recherche sur l'ID. Vous n'avez pas besoin (ou ne voulez pas vouloir le surcoût de) d'utiliser l'ensemble de l'objet Utilisateur en tant que clé. Je serais enclin à utiliser deux dictionnaires: c'est simple et propre. Vous pouvez vous en passer en stockant deux fois le même objet dans un dictionnaire en utilisant un type de clé qui peut représenter l'email ou l'identifiant, mais je ne vois pas ce que cela vous achète. – mtreit

0

Vous pouvez facilement créer deux dictionnaires car les entrées sont stockées par référence de toute façon. Mais comme d'autres l'ont dit, il semble que vous n'auriez jamais besoin de trouver l'ID si vous avez l'utilisateur qui contient l'ID.

+0

ouais c'est facile. Je pense que je ne peux pas l'obtenir avec un comparateur personnalisé .. – DarthVader

0

Je sais que cette question est vieux, mais il est venu sur une recherche Google, je viens de le faire et je ne suis pas satisfait de la réponse haut. Je suggère d'utiliser Tuple comme clé dans le dictionnaire. Si name et email sont des chaînes, et id est un int, alors il pourrait s'agir d'un Tuple

+1

Votre réponse doit inclure un exemple de code. –

Questions connexes