2010-04-19 23 views
13

Quale sarebbe la migliore struttura di dati C# per l'utilizzo di un tasto e l'estrazione di due valori?C# Dictionary, 2 Valori

Essenzialmente ho bisogno di un Dictionary<string, string, string>. C'è qualcosa di simile?

risposta

21

Se stai usando .NET 4, è possibile utilizzare

Dictionary<string, Tuple<string, string>> 

Se non sei, è possibile creare il proprio Tuple tipo che funziona allo stesso modo :)

In alternativa, se ne hai solo bisogno in un posto dove potresti creare il tuo tipo che incapsula le due stringhe ordinatamente usando nomi appropriati. Per esempio:

public sealed class NameAndAddress 
{ 
    private readonly string name; 
    public string Name { get { return name; } } 

    private readonly string address; 
    public string Address { get { return address; } } 

    public NameAndAddress(string name, string address) 
    { 
     this.name = name; 
     this.address = address; 
    } 
} 

quindi è possibile utilizzare:

Dictionary<string, NameAndAddress> 

che lo rende molto chiaro che cosa sta per essere memorizzati.

Se si desidera, è possibile implementare l'uguaglianza. Personalmente mi piacerebbe vedere questo genere di cose ha reso più facile - tipi anonimi quasi farlo, ma poi non li posso nominare ...

+2

Ooh tupla ....! –

+0

Sigillato, readonly, proprietà, ... - non confonderlo;) – Danvil

+1

Sigillato, readonly, proprietà, ... - uno dei più concisi esempi immutabili che ho visto. Ma per quanto riguarda l'override di Equals e GetHashCode? :) –

6
class A { 
    public string X, Y; 
} 

Dictionary<string, A> data; 
3

Creare una struttura che contiene i valori e quindi utilizzare

Dictionary<string, MyStruct> dict = new Dictionary<string, MyStruct>(); 
0

è possibile utilizzare un dizionario di KeyValuePairs

Dictionary<string,KeyValuePair<string,string>> 
+3

Non mi piace questa idea, anche se * farà * quello che vuoi, è fuorviante - perché la seconda stringa è vista come una chiave per il terzo? –

+0

Sì, hai ragione, ma in alcune situazioni è una soluzione rapida e non così brutta ... In ogni caso un'implementazione personalizzata, o l'uso di Tuple è probabilmente il migliore in generale (ma Tuple è solo in .net 4.0) – digEmAll

+0

-1 Questo è molto fuorviante. Non c'è logica in quale dovrebbe essere una chiave e quale dovrebbe essere un valore in KeyValuePair

0

Sì, c'è exactly that. Puoi memorizzare i tuoi due valori in una classe o in una struttura. O vuoi qualcos'altro?

0

Fai una lezione per mantenere il tuo valore e renderlo un dizionario. Se la classe viene utilizzata solo nel contesto di una classe contenente (ad esempio, viene utilizzata per fornire una struttura dati per una proprietà di classe), è possibile rendere la classe una classe nidificata privata.