2016-05-31 79 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(); 

但我个人认为你原来的方法更容易阅读和理解意图。应该有很少的性能差异。 更短代码并不总是更好代码。