web-dev-qa-db-fra.com

Dictionnaire C # avec deux valeurs par clé?

J'ai une situation dans le code où un Dictionary<string, string> semblait être la meilleure idée - j'ai besoin d'une collection de ces objets et j'ai besoin qu'ils soient accessibles via une clé unique. Exactement à quoi sert le concept du Dictionnaire, non?

Eh bien, les exigences se sont développées au point où j'ai maintenant besoin de conserver un peu d'informations supplémentaires par clé (une valeur booléenne, si vous êtes curieux).

Donc, je pense développer le concept pour créer une nouvelle structure de données avec la chaîne et le booléen et que ce soit maintenant un Dictionary<string, NewCustomObject>.

Cependant, pour une seule valeur supplémentaire comme un drapeau booléen, cela ressemble à une surpuissance. Et pourtant, je ne connais aucun objet générique de type Dictionnaire avec deux valeurs par clé.

Le simple fait d'avoir un dictionnaire d'objets personnalisés est-il la meilleure façon de procéder ou existe-t-il quelque chose de plus simple pour ce scénario?

38
Tom Kidd

En fait, ce que vous venez de décrire est une utilisation idéale pour la collection Dictionary. Il est censé contenir des paires clé: valeur, quel que soit le type de valeur. En faisant de la valeur sa propre classe, vous pourrez l'étendre facilement à l'avenir, si le besoin s'en fait sentir.

32
Traveling Tech Guy
class MappedValue
{
    public string SomeString { get; set; }
    public bool SomeBool { get; set; }
}

Dictionary<string, MappedValue> myList = new Dictionary<string, MappedValue>;
13
Ed S.

Je pense qu'en général, vous entrez dans le concept de Tuples - quelque chose comme Tuple<x, y, z>, ou Tuple<string, bool, value>.

C # 4.0 aura un support dynamique pour les tuples, mais à part cela, vous devez rouler le vôtre ou télécharger une bibliothèque de tuple.

Vous pouvez voir ma réponse ici où j'ai mis un exemple de code pour une classe générique Tuple. Ou je peux simplement le republier ici:

public class Tuple<T, T2, T3>
{
    public Tuple(T first, T2 second, T3 third)

    {
        First = first;
        Second = second;
        Third = third;
    }

    public T First { get; set; }
    public T2 Second { get; set; }
    public T3 Third { get; set; }

}
7
womp

Dans .NET4, vous pouvez utiliser (non coché): Dictionary<string, Tuple<bool,string>>

6
Henk Holterman

Je ne crois pas que .net a intégré Multi-Map, qui est généralement une structure de données que vous pouvez utiliser pour faire ce type de stockage. D'un autre côté, je ne pense pas que ce soit exagéré du tout simplement en utilisant un objet personnalisé qui contient à la fois une chaîne et un booléen.

3
Ralph Caraveo

Ça ne marche pas pour toi?

Dictionary<string, List<string>>

Ou vous pouvez utiliser un Tuple et avoir un dictionnaire de cela:

Dictionary<string, Tuple<string, bool>>
2
Mehrdad Afshari

Tuple est toujours une bonne solution. De plus, dans une approche orientée objet, privilégiez toujours la composition à l'héritage. Construisez un objet composite faisant le regroupement. Simplement. Je pense que vous êtes couvert de quelques solutions agréables et propres ici, de collègues stackoverflow'ers. :)

1
Aggelos Biboudis

Un dictionnaire n'est qu'une collection d'objets à clé. En tant que tel, il contiendra tout type d'objet que vous souhaitez. Même le plus simple des objets, comme, par exemple, un tablea (qui dérive d'Object), mais nécessite beaucoup moins de code en votre nom.

Plutôt que d'écrire une classe entière, remplissez un tableau alloué dynamiquement ou une liste dans la valeur et exécutez avec cela.

Les dictionnaires sont très flexibles de cette façon.

0
Mike Hofer

Qu'en est-il de la classe Lookup ?

Modifier:

Après avoir lu attentivement la question, pensez que ce n'est pas la meilleure solution, mais c'est toujours une bonne solution pour le dictionnaire avec quelques valeurs pour une seule clé.

0
Kamarey

Une autre idée est de stocker le booléen dans une structure de données distincte, par ex. un HashSet.

0
reinierpost