Tuples in C# 4.0 verwenden

Tuples sind eine Möglichkeit Elemente mit verschiedenen Datentypen zu gruppieren. In Python oder Haspell gibt es dieses Feature schon länger. In .NET kann man Tuples ab der Version 4.0 nutzen.

Tuples erstellen

Um einen Tuple in C# zu erstellen benötigt man den Standardtyp Tuple. Die Tuple-Klasse hat 8 überladene statische Methoden mit dem Namen Create.

  • Create (T1)
  • Create(T1,T2)
  • Create(T1,T2,T3)
  • Create(T1,T2,T3,T4)
  • Create(T1,T2,T3,T4,T5)
  • Create(T1,T2,T3,T4,T5,T6,T7)
  • Create(T1,T2,T3,T4,T5,T6,T7,T8)

Die Methoden geben folgende Datentypen zurück.

  • Tuple<T1>
  • Tuple<T1,T2>
  • Tuple<T1,T2,T3>
  • Tuple<T1,T2,T3,T4>
  • Tuple<T1,T2,T3,T4,T5>
  • Tuple<T1,T2,T3,T4,T5,T6>
  • Tuple<T1,T2,T3,T4,T5,T6,T7>
  • Tuple<T1,T2,T3,T4,T5,T6,T7,TRest…> ( alle Tuples > 8 wie das geht kommt noch ;) )

Hier der Code um einen einfachen Tuple zu erstellen.

var album = Tuple.Create<string,int>("Rammstein", 2008);
Console.WriteLine(album);
Console.Read();

Die Ausgabe ist: (Rammstein, 2008)

Natürlich kann man auch auf einzelne Elemente zugreifen.

var album = Tuple.Create<string,int>("Rammstein", 2008);
Console.WriteLine("Band: {0}, Jahr: {1}", album.Item1, album.Item2);
Console.Read();

Die Ausgabe ist: Band: Rammstein, Jahr: 2008

Verschachtelte Tuples

Tuples lassen sich auch verschachteln.

var album = Tuple.Create("Rammstein", 2008,new Tuple<int,int>(1,2));
Console.WriteLine(album);
Console.Read();

Die Ausgabe ist: (Rammstein,(1,2))

Tuples > 8

Die Create-Methoden haben nur 8 Überladungen. Wenn man Tuples erstellen will, die größer als 8 Elemente sind, benutzt man den new-Operator.

var album = new Tuple<string, int, int, int, int, int, int,  Tuple<int, int>>("Rammstein", 1, 2, 3, 4, 5, 6, new  Tuple<int, int>(8, 9));
Console.WriteLine(album);
Console.Read();

Die Ausfabe ist: (Rammstein, 1, 2, 3, 4, 5, 6, 7, 8, 9)

Das direkte zugreifen auf die Elemente ist ebenfalls möglich.

var album = new Tuple<string, int, int, int, int, int, int, Tuple<int, int>>("Rammstein", 1, 2, 3, 4, 5, 6, new Tuple<int, int>(8, 9));
Console.WriteLine(album.Rest.Item1);
Console.Read();

Fazit

Hin und wieder kommt man in die Verlegenheit temporär Daten speichern zu müssen. Eine vernünftige Gruppierung hält den Code sauber und übersichtlich. Was man allerdings vermeiden sollte, ist das Verwenden von Tuples anstatt eines sauberen Klassenkonzepts. Wenn ich also meinen Album-Datentyp noch öfter brauchen werden, dann erstelle ich mir lieber eine Klasse mit sprechend benannten Attributen anstatt Item1 Item2, etc.

Und noch etwas zum Schluss: Die Frage die ich mir zu Anfang gestellt habe war, warum man hier mit der Begrenzung auf 8 Parameter arbeitet. Des Rätsels Lösung: C# unterstützt keine generischen Konstruktoren/Methoden mit unterschiedlichen Datentypen. Soll heißen, dass z.B Create nur generisch sein könnte, wenn es nur int-Werte nehmen würde. Das ergibt aber keinen Sinn, da man dann besser ein Array deklarieren könnte.

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>