2013-02-20 2 views
5

Ich brauche oft einen Schlüssel für mehrere Vaules-Wörterbuch, aber in C# die meisten von ihnen sind zwei Dimensionen wie Dictionary und Hashtable.Ein Schlüssel zu mehreren Werten Wörterbuch in C#?

Ich möchte etwas wie folgt aus:

var d = new Dictionary<key-dt,value1-dt,value2-dt,value3-dt,value4-dt>(); 

dt innerhalb <> Datentyp bedeutet. Hat jemand Ideen dazu?

+1

Ich nehme an, Sie möchten ein Schlüsselwertpaar mit dem Wert eine Liste sein? Es ist gültig zu tun: 'var d = new Dictionary >();' oder was auch immer Sie eine Liste speichern möchten. –

+2

Sie müssen erklären, was Sie ein bisschen besser wollen. Die aktuelle Erklärung sagt eigentlich nichts. Geben Sie ein Beispiel dafür, wie Sie das Wörterbuch verwenden können, das Sie sich vorstellen. – Pete

+0

Das Wörterbuch benötigt 2 Argumente. Was versuchen Sie letztendlich hier zu erreichen? – MethodMan

Antwort

13

Ein Wörterbuch ist ein Schlüssel/Wert-Paar, bei dem der Wert abhängig vom Schlüssel abgerufen wird. Die Schlüssel sind alle einzigartig.

Nun, wenn Sie ein Dictionary mit 1 keytype und mehrere Werttypen möchten, haben Sie ein paar Optionen:

zuerst zu bedienen ist ein Tuple

var dict = new Dictionary<KeyType, Tuple<string, string, bool, int>>()

Der andere zu verwenden ist (mit C# 4.0 und höher):

var dict = new Dictionary<KeyType, dynamic>()

Die System.Dynamic.ExpandoObject kann Wert eines beliebigen Typs haben.

using System; 
using System.Linq; 
using System.Collections.Generic; 

public class Test { 
    public static void Main(string[] args) { 
     dynamic d1 = new System.Dynamic.ExpandoObject(); 
    var dict = new Dictionary<int, dynamic>(); 
     dict[1] = d1; 
     dict[1].FooBar = "Aniket"; 
     Console.WriteLine(dict[1].FooBar); 
     dict[1].FooBar = new {s1="Hello", s2="World", s3=10}; 
     Console.WriteLine(dict[1].FooBar.s1); 
     Console.WriteLine(dict[1].FooBar.s3); 
    } 
} 
+0

Kannst du das bitte erklären? Dict [1] = d1; dict [1] .FooBar = "Aniket"; '? wie ich verstanden 'dic [1] .FooBar = Aniket' ist der Schlüssel für Wörterbuch, aber was bedeutet' FooBar' in diesem Fall? – vladimir

+0

@vladimir die '.FooBar' bedeutet in diesem Fall, dass es überhaupt etwas geben kann. Sie können den gleichen Code nehmen und ".FooBar" durch '.vladimir' ersetzen und es würde immer noch funktionieren. Ich habe zur Laufzeit dynamisch eine Eigenschaft in 'dict [1]' (die auf 'd1' verweist) namens 'FooBar' erstellt –

1

Verwenden Sie einen tuple als Schlüssel.

var d = new Dictionary<Tuple<string,string,bool,int>,any-data-typs>(); 
+2

Ich würde eher einen dieser Typen als Schlüssel und Tuple <...> als Wert empfehlen. –

+0

Danke, das ist was ich will. Ich werde es so verwenden: var d = neues Wörterbuch >(); – Gisway

+0

@LukaszM - so wie ich es verstanden habe, wollte er einen zusammengesetzten Schlüssel. –

4

beschreiben beide die entsprechenden Schlüsselfelder und die entsprechenden Wertefelder mit Klassen. und verwenden Sie ein Wörterbuch dieser Typen.

var dictionary = new Dictionary<TheKeyType, TheValuesType>(); 

Hinweis: Wenn Sie als Schlüssel mehrere Werte haben handeln, würden Sie eine Klasse definieren, um diese Werte zu kapseln und die ordnungsgemäße Überschreibungen von GetHashCode liefern und Equals, so dass das Wörterbuch ihre Gleichheit erkennen konnte.

Kurz gesagt, Sie können Tupel verwenden, aber Sie wollen dieses Muster begrenzen, da Tupel nicht selbstbeschreibend sind.

var dictionary = new Dictionary<Tuple<Key1Type, Key2Type, Etc>, Tuple<Value1Type, Value2Type, Etc>>(); 
1

Statt ein Tuple zu verwenden, die eine absolut gültige Lösung ist, rate ich würde Ihre eigene Klasse als Schlüssel und/oder Wert auf die Schaffung.

Sie könnten feststellen, dass das Tupel zu einem schwer lesbaren Code wird.

+0

Mit der Einschränkung, dass er Equals() und GetHashCode() manuell implementieren musste. –

+0

@SystemDown: Danke, dass Sie darauf hingewiesen haben. Man entscheidet sich am meisten für die Kompromisse –

+2

@SystemDown Das ist nur wahr, wenn die benutzerdefinierte Klasse der Schlüssel ist; wenn es der Wert ist, der nicht benötigt wird. – Servy

Verwandte Themen