Dictionnaire avec plusieurs clés et de multiples valeurs pour chaque touche
Salut à tous, je vais avoir une exigence où je dois attribuer plusieurs touches et pour que plusieurs touches je dois attribuer plusieurs valeurs
Mon exigence est comme suit. Je vais avoir EmpID
, PayYr
et PayID
pour chaque employé.
Que je accéder à mes données comme suit:
EmpID 1000 1000 1000 1000
PayYr 2011 2011 2011 2012
PayID 1 2 3 1
Je voudrais avoir mon dictionnaire de sorte que le dictionnaire avec la valeur de la clé de résultat est comme suit:
1000 - 2011 - 1,2,3
1000 - 2012 - 1
J'ai essayé quelque chose comme suit
public struct Tuple<T1, T2>
{
public readonly T1 Item1;
public readonly T2 Item2;
public Tuple(T1 item1, T2 item2)
{
Item1 = item1;
Item2 = item2;
}
}
Exemple de code
for (int empcnt = 0; empcnt < iEmpID.Length; empcnt++)
{
for (int yrcnt = 0; yrcnt < ipayYear.Length; yrcnt++)
{
List<int> lst1 = new List<int>();
var key1 = new Tuple<int, int>(iEmpID[empcnt], ipayYear[yrcnt]);
if (!dictAddValues.ContainsKey(key1))
{
dictAddValues.Add(key1, lst1);
lst1.Add(lst[yrcnt]);
}
}
}
Mais je ne reçois pas mon résultat que j'ai besoin alors quelqu'un peut-il m'aider.
Ce - vous et comment est-il différent de ce que vous attendez?
Je suis seule les valeurs de mon résultat attendu est
Je suis en mesure de jumeler les valeurs de clé, mais pas les valeurs que requis par
Pourquoi êtes-vous de la création d'un Tuple de la classe, c'est déjà existants .NET 4.0: msdn.microsoft.com/en-us/library/system.tuple.aspx
Pourquoi voulez-vous un dictionnaire? Ne peut-on pas construire une classe d'Employés et de les stocker dans une liste?
Je suis seule les valeurs de mon résultat attendu est
1000 - 2011 - 1,2,3 1000 - 2012 - 1
Je suis en mesure de jumeler les valeurs de clé, mais pas les valeurs que requis par
Pourquoi êtes-vous de la création d'un Tuple de la classe, c'est déjà existants .NET 4.0: msdn.microsoft.com/en-us/library/system.tuple.aspx
Pourquoi voulez-vous un dictionnaire? Ne peut-on pas construire une classe d'Employés et de les stocker dans une liste?
OriginalL'auteur Dorababu Meka | 2012-02-17
Vous devez vous connecter pour publier un commentaire.
Personnellement, je serais probablement utiliser un Dictionnaire de Dictionnaires, par exemple
IDictionary<int, IDictionary<int, IList<int>>>
. Non je ne suis pas entièrement sûr de savoir comment vous avez l'intention d'accès ou de faciliter ces données; que sera avoir un impact important sur l'efficacité de ma suggestion. Sur le plan positif, il vous permettra d' -- relativement facilement -- l'accès des données, si et seulement si vous avez accès, dans l'ordre que vous avez configuré votre dictionnaires.(À la réflexion, tout simplement le type de la déclaration elle-même est si laid et vide de sens, vous pouvez sauter ce que j'ai dit ci-dessus.)
Si vous êtes d'accéder à des champs plutôt au hasard, peut-être un simple dénormalisée
ICollection<Tuple<int, int, int>>
(ou l'équivalent) devra faire l'affaire, avec l'agrégation dans d'autres parties de votre application selon vos besoins. LINQ peut aider ici beaucoup, surtout son agrégation, de regroupement et de recherche de fonctionnalités.Mise à jour: j'espère que cela clarifie:
Le prendre avec un grain de sel; voir le commentaire.
Puis-je vous demander d'abord l'endroit où vos données provient exactement? Est-il un
DataTable
? Une LINQ-to-SQL résultat? Dans ce cas, je pourrais rendre le code plus concis (et plus claire).J'ai ajouté un exemple rapide. Encore une fois, il n'a de sens que dans de rares scénarios, en fonction de votre utilisation réelle de cas et de la façon dont vous souhaitez accéder aux données. Notez que j'ai écrit vers le bas dans le bloc-notes. Aucune idée, s'il en fait la compile. Mais la mécanique doit être clair.
Salut manny en fait, je vais obtenir les données de contrôle gridview éléments sélectionnés aucun problème, je peux faire un
data row
mais pouvez-vous me donner un beaucoup un code clair, comme vous l'avez dit vous écrit en note pad, j'obtiens des erreursMerci s'accoupler j'ai travaillé dessus
OriginalL'auteur Manny
Je pense que vous êtes absent de la Comparer à la pièce. Voir si l'article ci-dessous permet de.
Dictionnaire avec une Touche Personnalisée
http://www.codeproject.com/Articles/23610/Dictionary-with-a-Custom-Key
OriginalL'auteur Chris Gessler
Si la clé est une partie de la classe alors utiliser KeyedCollection.
C'est un Dictionnaire dont la clé est dérivée à partir de l'objet.
Sous les couvertures, il est Dictionnaire. D Ne pas avoir à répéter la clé dans la Clé et la Valeur.
Pourquoi prendre une chance que la clé n'est pas la même dans la Clé comme la Valeur. Ne pas répéter les mêmes informations dans la mémoire.
KeyedCollection Classe
Indexeur pour exposer la clé composite
OriginalL'auteur paparazzo
Vous avez besoin pour mettre en œuvre d'égal à Égal et GetHashCode dans votre
Tuple
struct:OriginalL'auteur awe
Je ne suis pas sûr à 100% de la exacte données que vous souhaitez utiliser comme une clé. Je pense que 2? 2 valeurs entières? C'est ce que je vais assumer ci-dessous, mais si vous voulez trois ou le type est différent, il suffit d'ajuster en conséquence. Je suggère ce qui suit (étape 1, l'étape 2 est facultatif, mais je le ferais)
Étape 1 de la Création de votre propre clé struct, pour être utilisée comme clé dans un dictionnaire standard. Donner 2 propriétés (ou trois, peu importe) pour vos valeurs qui servira de clé et/ou un Constructeur prenant/réglage de ces valeurs.
Spécifier une méthode GetHashCode. Quelque chose comme:
Remarque: Oui, vous pourrait utiliser un Tuple. Des n-uplets . . . ne sont pas aussi cool que le premier semble. Vos noms de propriété sera Élément1, etc. Pas très clair. Et vous finissent souvent voulu le remplacement et ajouter des choses assez vite. Juste commencer à partir de zéro.
Comme ceci:
public struct PayKey {
}
Remarque: Si l'un de vos multiples valeurs que vous souhaitez utiliser dans votre combiné clés sont des types référence, vous devriez probablement créer une classe au lieu d'une struct. Si oui, vous aurez également besoin de remplacer
Equals
pour qu'il fonctionne correctement en tant que clé de dictionnaire.(Et ajouter des propriétés publiques pour vos valeurs de clé si vous ne l'avez pas déjà.)
Ou, si vous créez le dictionnaire personnalisé comme je le mentionne ci-dessous, il serait commode d'utiliser un IEqualityComparer. (En gros, si vous utilisez une classe de votre clé, vous devez assurez-vous que le dictionnaire est voir deux identiques PayKey l'objet comme "égaux". Par défaut, même avec des valeurs égales, ce sont des références à des objets différents, de sorte que le cadre tiendra compte de leur ne sont pas égaux)
Étape 2 Créer une classe qui hérite de Dictionnaire. Deux méthodes supplémentaires:
OriginalL'auteur Patrick Karcher
Essayez de prendre un coup d'oeil à https://www.nuget.org/packages/Microsoft.Experimental.Collections à partir de microsoft qui contient le MultiValueDictionary type.
OriginalL'auteur VoteCoffee