我想知道如何将数组添加到List<Tuple<double, double>>
。
我的(简短)代码:
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
的任何方式吗?
答案 0 :(得分:4)
您可以使用LINQ的Enumerable.Zip
扩展方法。根据文档,这个:
将指定的函数应用于两个序列的相应元素,生成一系列结果。
在这种情况下,我们可以使用Tuple.Create
作为从两个元素创建元组的函数。
var tup = var1.Zip(var2, Tuple.Create).ToList();
虽然请注意,在序列长度不同的情况下,这可能会给您的代码带来稍微不同的结果。按照文档再次:
如果输入序列的元素数量不同,则该方法会合并元素,直到它到达其中一个序列的末尾
查看this fiddle是否有工作演示。
答案 1 :(得分:1)
你必须循环自己或让LINQ循环,Enumerable.Zip
通过索引加入:
List<Tuple<double, double>> tup = var1.Zip(var2, (d1, d2) => Tuple.Create(d1, d2))
.ToList();
所以这不是更有效但可能更具可读性。
答案 2 :(得分:1)
好吧,你可以使用Zip
将集合投影到元组列表中:
var tup = var1.Zip(var2, (v1, v2) => new Tuple<double, double>(v1,v2))
.ToList();
但就个人而言,我发现您的原始方法更易于阅读并理解 intent 。性能差异应该很小。 更短的代码并不总是更好的代码。