2009-11-04 7 views
1

Je veux construire une collection à 2 dimensions où j'ai besoin d'une combinaison unique de paires de valeurs clés. Par exemple, le domaine "Société" (Id: 1) peut avoir MachineName "Machine1" et "Machine2", mais ne peut pas ajouter de nouveau MachineName "Machine1". Un autre domaine "Corporate" (Id: 2) peut avoir un autre nom de machine "Machine1".collection de valeur de clé unique en C#

ici ma collection sera comme ça 1 Machine1, 1-Machine2, 2-Machine1. L'ajout de 1-Machine1 ou 2-Machine1 devrait être une entrée invalide. Veuillez indiquer le type de données ou l'approche pour cela. Je ne peux pas utiliser Dict> type de données, car cela peut entraver les performances si la taille augmente.

+0

Est-ce la taille de votre collection de domaines ou la taille de votre collection de machines qui vous inquiète au niveau de la performance? Un dictionnaire devrait être un type de données très performant - il est implémenté en utilisant une table de hachage. – Damovisa

Répondre

2

Je suis désolé, mais d'après votre description, il semble toujours que l'implémentation d'un dictionnaire conviendrait parfaitement.

Si et quand les performances de l'application souffre en raison de la vitesse du dictionnaire, vous pouvez revenir sur le problème et rouler votre propre solution spécifiquement adaptée.

+0

Non. Je ne peux pas .Si je veux utiliser le dictionnaire, alors je dois garder DomainId comme clé et Liste de MachineName comme valeur.Pour chaque ajout de valeur, je dois vérifier la première clé existe, sinon ajouter une clé. Si la clé existe, vérifiez si la valeur existe, sinon ajoutez la valeur à la liste, sinon, ignorez l'addition. Relativement regarder pourrait être comme vérifier si la clé existe et si oui, puis vérifier si la valeur existe dans la liste, puis continuer l'exécution du programme. – mandar

+0

Je ne pense pas que vous devez faire ces contrôles. Je pense à un dictionnaire, vous pouvez simplement faire référence à myDomains ["domain1"] '. Si l'entrée 'domain1' est déjà là, pointant vers cette entrée. Si ce n'est pas là, ça va le créer. – Damovisa

0

Avez-vous besoin de pouvoir rechercher efficacement la liste des domaines avec un nom de machine donné? Sinon, un Hashtable<String, HashSet<String>> semble être un bon ajustement.

Il semble également y avoir quelque chose qui s'appelle NameValueCollection, ce qui peut convenir si vous modifiez les valeurs par défaut afin qu'elles ne soient pas sensibles à la casse ou à la culture.

+0

J'utilise C# 2.0.So ne peut pas utiliser HashSet – mandar

+0

@mandar - C'est une honte ... Une raison particulière pour laquelle vous ne pouvez pas cibler 3.5? – Damovisa

+0

Je suis désolé, mais c'est une application héritée, développée il y a près de 4-5 ans. – mandar

0

Vous ne précisait pas cela comme une exigence, mais je pense que vous est qu'il faut aussi pouvoir interroger la structure de données pour toutes les machines pour un « domaine » spécifique. Ex. liste les machines appartenant à la société 1. C'est la seule raison pour laquelle je peux penser à l'endroit où les performances de l'utilisation d'un dictionnaire peuvent être inacceptables (puisque vous devrez parcourir toute la liste pour trouver toutes les entrées correspondantes).

Dans ce cas, vous pouvez envisager de représenter les données sous la forme d'un arbre.

Edit:

Sur la base de votre commentaire ci-dessus, vous pouvez simplement concaténer vos clés sous forme de chaîne et d'utiliser un HashSet pour vérifier si vous avez déjà validé cette clé.

1

Vous pouvez faire quelque chose comme ceci:

Dictionary<String, List<String>> mapping = new Dictionary<string, List<string>>(); 
mapping.Add("1",new List<string>()); 
mapping["1"].Add("Machine1"); 
mapping["1"].Add("Machine2"); 

Cela vous donnera un à plusieurs entre domaine et machines.

ou la classe NameValueCollection ferait la même chose.

+0

Cela ne vous empêchera pas d'effectuer 'mapping [" 1 "]. Ajoutez de nouveau (" Machine1 ")' à nouveau ... Je crois que les machines doivent être uniques. – Damovisa

+0

vrai, vous auriez à faire des contrôles. –

1

Vous avez donc besoin d'une sorte de collection avec une clé unique, et chaque élément de cette collection est unique.

Donc vraiment, vous parlez d'un dictionnaire où la valeur dans le dictionnaire est une collection unique.

En supposant que vous ne parle que de chaînes, je serais en utilisant quelque chose comme:

Dictionary<string, HashSet<string>> 

Quelqu'un me corriger si je me trompe, mais je pense que l'avantage d'utiliser ces structures génériques est que vous pouvez (dès le départ), faites ceci:

Dictionary<string, HashSet<string>> domains = new Dictionary<string, HashSet<string>>(); 
domains["Domain1"].Add("Machine1"); 
+0

Oui, à droite: "la valeur dans le dictionnaire est une collection unique". Mais existe-t-il une alternative pour démarrer sans dictionnaire. Je ne me dérange pas "clé" (domainId dans ce cas) se dupliqué. Parce que j'ai juste ajouter ou effacer ou itérer par combinaison. Peut être un type de données assurant une combinaison clé-valeur unique. – mandar

+0

Je ne suis toujours pas sûr de savoir pourquoi avoir un dictionnaire est un problème. C'est une structure très rapide pour récupérer des objets basés sur une clé. Même si la liste des domaines devient très grande, vous pourrez toujours accéder à sa liste de machines en environ O (1) temps. – Damovisa

Questions connexes