85 votes

Dictionnaire à valeurs multiples

Comment créer un dictionnaire multi-valeurs en c# ?

Par exemple Dictionary<T,T,T> où le premier T est la clé et les deux autres sont les valeurs.

Cela serait donc possible : Dictionary<int,object,double>

Gracias

70voto

Jon Erickson Points 29643

Si vous essayez de regrouper des valeurs, c'est peut-être l'occasion de créer une structure ou une classe simple et de l'utiliser comme valeur dans un dictionnaire.

public struct MyValue
{
    public object Value1;
    public double Value2;
}

vous pourrez alors disposer de votre dictionnaire

var dict = new Dictionary<int, MyValue>();

Vous pouvez même aller plus loin et mettre en œuvre votre propre classe de dictionnaire qui gérera toutes les opérations spéciales dont vous avez besoin. Par exemple, si vous souhaitez disposer d'une méthode Add qui accepte un int, un objet et un double

public class MyDictionary : Dictionary<int, MyValue>
{
    public void Add(int key, object value1, double value2)
    {
        MyValue val;
        val.Value1 = value1;
        val.Value2 = value2;
        this.Add(key, val);
    }
}

il suffirait alors d'instancier et d'ajouter au dictionnaire de la sorte, sans avoir à se préoccuper de la création de structures "MyValue" :

var dict = new MyDictionary();
dict.Add(1, new Object(), 2.22);

66voto

Jon Skeet Points 692016

Il suffit de créer un Pair<TFirst, TSecond> et l'utiliser comme valeur.

J'en ai un exemple dans mon Code source C# en profondeur . Reproduit ici par souci de simplicité :

using System;
using System.Collections.Generic;

public sealed class Pair<TFirst, TSecond>
    : IEquatable<Pair<TFirst, TSecond>>
{
    private readonly TFirst first;
    private readonly TSecond second;

    public Pair(TFirst first, TSecond second)
    {
        this.first = first;
        this.second = second;
    }

    public TFirst First
    {
        get { return first; }
    }

    public TSecond Second
    {
        get { return second; }
    }

    public bool Equals(Pair<TFirst, TSecond> other)
    {
        if (other == null)
        {
            return false;
        }
        return EqualityComparer<TFirst>.Default.Equals(this.First, other.First) &&
               EqualityComparer<TSecond>.Default.Equals(this.Second, other.Second);
    }

    public override bool Equals(object o)
    {
        return Equals(o as Pair<TFirst, TSecond>);
    }

    public override int GetHashCode()
    {
        return EqualityComparer<TFirst>.Default.GetHashCode(first) * 37 +
               EqualityComparer<TSecond>.Default.GetHashCode(second);
    }
}

32voto

teedyay Points 10833
Dictionary<T1, Tuple<T2, T3>>

Edit : Sorry - I forgot you don't get Tuples until .NET 4.0 comes out. D'oh !

7voto

Je pense que c'est un peu exagéré pour la sémantique d'un dictionnaire, puisque le dictionnaire est par définition une collection de clés et de valeurs respectives, tout comme nous voyons un dictionnaire de livre de langue qui contient un mot comme clé et sa signification descriptive comme valeur.

Mais vous pouvez représenter un dictionnaire qui peut contenir une collection de valeurs, par exemple :

Dictionary<String,List<Customer>>

Ou un dictionnaire d'une clé et la valeur en tant que dictionnaire :

Dictionary<Customer,Dictionary<Order,OrderDetail>>

Vous disposez alors d'un dictionnaire qui peut avoir plusieurs valeurs.

5voto

Otávio Décio Points 44200

Je ne pense pas que vous puissiez le faire directement. Vous pourriez créer une classe contenant à la fois votre object y double et d'en placer une instance dans le dictionnaire.

class Pair
{
    object obj;
    double dbl;
}

Dictionary<int, Pair> = new Dictionary<int, Pair>();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X