列表<元组<T>&GT; |带阵列的AddRange

时间:2016-05-31 13:20:09

标签: c# arrays list collections tuples

我想知道如何将数组添加到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的任何方式吗?

3 个答案:

答案 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 。性能差异应该很小。 更短的代码并不总是更好的代码。