列表> | AddRange与阵列
问题描述:
我想知道如何将阵列添加到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
也许?
答
您可以使用LINQ的Enumerable.Zip
扩展方法。根据文档,这:
将一个指定的函数应用于两个序列的相应元素,产生一个结果序列。
在这种情况下,我们可以使用Tuple.Create
作为从两个元素中创建元组的函数。
var tup = var1.Zip(var2, Tuple.Create).ToList();
虽然请注意,在序列长度不相同的情况下,这可能会给您的代码带来稍微不同的结果。每一次的文档:
如果输入序列不具有相同数量的元素,该方法结合元素,直到它到达序列中的一个
退房this fiddle的一个工作结束演示。
答
你必须循环自己或让LINQ循环,Enumerable.Zip
加入由指数:
List<Tuple<double, double>> tup = var1.Zip(var2, (d1, d2) => Tuple.Create(d1, d2))
.ToList();
因此,这不是更有效,但可能是更具可读性。
答
嗯,你能使用到Zip
项目集合到元组的列表:
var tup = var1.Zip(var2, (v1, v2) => new Tuple<double, double>(v1,v2))
.ToList();
但我个人认为你原来的方法更容易阅读和理解意图。应该有很少的性能差异。 更短代码并不总是更好代码。
运行良好。非常感谢你 :) – C4u