Tipps und Tricks rund um .NET und Visual Studio

Framework Class Library Tuples
Kommentare

Dr. Holger Schwichtenberg (MVP) und FH-Prof. Manfred Steyer teilen in der Kolumne „.NETversum“ ihr Expertenwissen rund um .NET-Tools und WPF mit.

Windows Developer

Dieser Beitrag aus der Kolumne .NETversum von Dr. Holger Schwichtenberg und Manfred Steyer ist erstmalig erschienen im Windows Developer 7.2012

Um zu verhindern, dass einzelne auf .NET basierende Sprachen das Konzept von Tupel auf unterschiedliche Arten implementieren, wurde in .NET 4 mit der Klasse Tuple (System.Tuple) eine einheitliche Tupel-Implementierung bereitgestellt. Ähnlich wie ein Array kann ein Tupel mehrere Werte aufnehmen. Anders als bei Arrays müssen diese jedoch nicht vom selben Typ sein. Die Typen dieser Werte werden als Typparameter angegeben. Da in Sprachen wie C# oder Visual Basic jedoch keine Möglichkeit für die Angabe einer variablen Anzahl von Typparametern vorgesehen ist, stehen unter anderem sieben Implementierungen, die mit ein bis sieben Typen parametrisiert werden können, zur Verfügung. Daneben existiert eine achte Implementierung, die neben den soeben erwähnten sieben Werten ein weiteres Tupel, dessen Werte an den ursprünglichen angehängt werden, aufnimmt. Somit können auch längere Tupel abgebildet werden. Werden hingegen an die ersten sieben Elemente Tupel übergeben, so werden diese als Tupel im ursprünglichen Tupel behandelt und nicht an diesen angehängt. Auf die einzelnen Elemente wird über die Eigenschaften Item1 bis Item7 zugegriffen. Die Eigenschaft für den Zugriff auf das im achten Parameter angegebene Tupel nennt sich Rest.

Zur Erzeugung von Tupel wurde die statische Factory-Methode Tuple.Create eingerichtet. Werden zwei Tupel mit dem Vergleichsoperator (== in C#, = in Visual Basic) verglichen, so bezieht sich dieser Vergleich auf deren Speicheradressen. Ein Vergleich mittels Equals prüft hingegen, ob die beiden Tupel dieselben Werte in derselben Reihenfolge aufweisen. Dazu wird an die Implementierung von Equals der einzelnen Elemente delegiert.

Listing 3 demonstriert die Verwendung von Tuple. Dazu wird ein Tupel erzeugt und mit Werten belegt. Auf das zweite Element wird über die Eigenschaft Item2 zugegriffen. Danach wird ein weiteres Tupel, mit denselben Werten erzeugt. Der Vergleich mittels Equals liefert true, da beide Tupel dieselben Werte aufweisen. Der Vergleich mit dem Vergleichsoperator liefert hingegen false, da es sich um zwei verschiedene Tupel handelt. Zur Demonstration der Simulation „längerer“ Tupel wird anschließend ein Tupel mit 14 Einträgen angelegt, wobei sich die Einträge 8 bis 14 in einem verschachtelten Tupel, das an den achten Parameter von Create übergeben wird, befinden. Ein weiteres Beispiel für die Verwendung von Tuple befindet sich in Listing 4. Die Methode Div nimmt zwei Integer für eine Division entgegen. Das Ergebnis ist ein Tupel, das sowohl das Ergebnis der Division als auch den Restwert beinhaltet.

Listing 3

Tuple t1 = Tuple.Create(1, "Max",  "Muster",  true);
Console.WriteLine(t1.Item2);
var t2 = Tuple.Create(1, "Max", "Muster", true);
bool equals1 = t1.Equals(t2);
bool equals2 = (t1 == t2);

Console.WriteLine("equals1: " + equals1);
Console.WriteLine("equals2: " + equals2);

var nested = Tuple.Create(8, 9, 10, 11, 12, 13, 14);
var largeTuple = new Tuple(1, 2, 3, 4, 5, 6, 7, nested);
var ten = largeTuple.Rest.Item3;   
Listing 4

static Tuple Div(int a, int b)
{
int r1 = a / b;
int r2 = a % b;

return Tuple.Create(r1, r2);
}
  
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -