2016-05-31 81 views
0

我想知道如何將陣列添加到List<Tuple<double, double>>列表<Tuple<T>> | AddRange與陣列

我的(短)代碼:

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>>(); 

我想補tup我的陣列。不幸的是,我需要爲每個條目設置一個Tuple。不知道如何做到這一點。

一般來說,我可以使用循環,但這對我來說看起來很髒。我的問題是關於性能和乾淨的代碼。

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

是不是有一個更簡單的方法來存檔?任何方式與AddRange也許?

回答

4

您可以使用LINQ的Enumerable.Zip擴展方法。根據文檔,這:

將一個指定的函數應用於兩個序列的相應元素,產生一個結果序列。

在這種情況下,我們可以使用Tuple.Create作爲從兩個元素中創建元組的函數。

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

雖然請注意,在序列長度不相同的情況下,這可能會給您的代碼帶來稍微不同的結果。每一次的文檔:

如果輸入序列不具有相同數量的元素,該方法結合元素,直到它到達序列中的一個

退房this fiddle的一個工作結束演示。

+0

運行良好。非常感謝你 :) – C4u

1

你必須循環自己或讓LINQ循環,Enumerable.Zip加入由指數:

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

因此,這不是更有效,但可能是更具可讀性。

1

嗯,你能使用Zip項目集合到元組的列表:

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

但我個人認爲你原來的方法更容易閱讀和理解意圖。應該有很少的性能差異。 更短代碼並不總是更好代碼。