2016-05-31 6 views
0

Ich frage mich, wie Arrays zu einem List<Tuple<double, double>> hinzufügen.Liste <Tuple<T>> | AddRange mit Arrays

My (kurz) Code:

double[] var1 = new double[5] { 1, 2, 3, 4, 5 }; 
double[] var2 = new double[5] { 1.5, 1.5, 2.5, 1.2, 1.1 }; 

List<Tuple<double, double>> tup = new List<Tuple<double, double>>(); 

Ich möchte tup mit meinen Anordnungen füllen. Leider müsste ich für jeden Eintrag eine Tuple Instanziieren. Ich weiß nicht, wie ich das machen soll.

Im Allgemeinen könnte ich nur eine Schleife verwenden, aber das sieht schmutzig für mich aus. Meine Frage bezieht sich auf Leistung und sauberen Code.

if(var1.Length == var2.Length) 
{ 
    for (int i = 0; i < var1.Length; i++) 
    { 
     tup.Add(new Tuple<double, double>(var1[i], var2[i])); 
    } 
} 

ISNT ein kürzerer Weg, dies zu archivieren? Irgendwie mit AddRange vielleicht?

Antwort

4

Sie könnten die Erweiterungsmethode Enumerable.Zip von LINQ verwenden. Pro Dokument:

Wendet eine angegebene Funktion auf die entsprechenden Elemente von zwei Sequenzen an und erzeugt eine Sequenz der Ergebnisse.

In diesem Fall können wir Tuple.Create als Funktion verwenden, um ein Tupel aus beiden Elementen zu erstellen.

var tup = var1.Zip(var2, Tuple.Create).ToList(); 

Beachten Sie, dass dies zu einem etwas anderen Ergebnis für den Code führen kann, wenn die Sequenzen nicht die gleiche Länge haben. Per Docs wieder:

Wenn die Eingangssequenzen nicht die gleiche Anzahl von Elementen haben, kombiniert die Verfahrenselemente, bis es das Ende einer der Sequenzen

Check out this fiddle für einen Arbeits erreicht Demo.

+0

Gut funktioniert. Vielen Dank :) – C4u

1

Sie haben sich in einer Schleife oder lassen LINQ Schleife, schließt sich Enumerable.Zip von Index:

List<Tuple<double, double>> tup = var1.Zip(var2, (d1, d2) => Tuple.Create(d1, d2)) 
    .ToList(); 

Das ist also nicht mehr effizient, aber vielleicht besser lesbar sein.

1

Nun, Sie konnte Verwendung Zip die Sammlungen zu einer Liste von Tupeln zu projizieren:

var tup = var1.Zip(var2, (v1, v2) => new Tuple<double, double>(v1,v2)) 
       .ToList(); 

Aber persönlich finde ich Ihre ursprüngliche Methode leichter zu lesen und die Absicht zu verstehen. Es sollte sehr wenig Leistungsunterschied sein. Kürzere Code ist nicht immer besser Code.