Tupel in Tupeln in C# 7.x

Der Dotnet-Doktor  –  2 Kommentare

Tupel dienen dazu, strukturierte und typisierte Einzelinformationen aneinander zu binden, ohne dafür eine Klasse oder Struktur zu deklarieren. Man kann sie ineinander verschachteln.

Tupel sind neu in C# 7.0 und wurden erweitert in C# 7.1. Sie dienen dazu, strukturierte und typisierte Einzelinformationen aneinander zu binden, ohne dafür eine Klasse oder Struktur zu deklarieren. Sie eignen sich damit besonders gut, wenn eine Methode mehrere Werte zurückliefern soll. Tupel sind da eleganter als die Verwendung von out-Variablen.

Gestern bei meinem User-Group-Vortrag zu C# 7.x und Visual Studio 2017 in Dortmund kam die Frage auf, ob man auch Tupel in Tupel verschachteln kann. Die Antwort ist: ja.

Das erste Beispiel zeigt ein einfaches, unverschachteltes Tupel mit seiner Erzeugung, Verwendung und Dekonstruktion:

   var dozent6 = (ID: 1, Name: "Holger Schwichtenberg", DOTNETExperte: true); 
Console.WriteLine(dozent6.ID + " heißt " + dozent6.Name + ".");
// Dekonstruction eines Tupel (in einzelne Variable!)
(int ID1, string Name1, bool DOTNETExperte1) = dozent6;
Console.WriteLine(ID1);
Console.WriteLine(Name1);
Console.WriteLine(DOTNETExperte1);

Im zweiten Beispiel beinhaltet das Tupel ein weiteres Tupel.

   // Tupel in Tupel (zwei Ebenen)
var dozent7 = (ID: 1, Name: "Holger Schwichtenberg", DOTNETExperte: true, Dozentendetails: (Ort: "Essen", Firma: "www.IT-Visions.de"));
Console.WriteLine("Der Dozent " + dozent7.Name + " arbeitet bei " + dozent7.Dozentendetails.Firma + ".");
// Dekonstruktion eines Tupels im Tupel inkl. Discard
var (ID7, Name7, _, (Ort7, Firma7)) = dozent7;
Console.WriteLine("Der Dozent " + Name7 + " arbeitet bei " + Firma7 + ".");

im dritten Beispiel werden Tupel über drei Ebenen verwendet. Ab wann es unübersichtlich wird, muss jeder für sich selbst entscheiden :-)

   // Tupel in Tupel (drei Ebenen)
   var dozent8 = (ID: 1, Name: "Holger Schwichtenberg", DOTNETExperte: true, Dozentendetails: (Firmensitz: (Stadt: "Essen", PLZ: 45257), Firma: "www.IT-Visions.de"));
Console.WriteLine("Der Dozent " + dozent7.Name + " arbeitet bei " + dozent7.Dozentendetails.Firma + " in " + dozent8.Dozentendetails.Firmensitz.Stadt);
// Dekonstruktion über drei Ebenen inkl. Discard
var (ID8, Name8, _, ( (Ort8, _), Firma8)) = dozent8;
Console.WriteLine("Der Dozent " + Name8 + " arbeitet bei " + Firma8 + " in " + Ort8);