如何在LINQ中通过索引连接两个集合

时间:2010-02-18 15:07:29

标签: c# linq collections join

什么是LINQ等效于以下代码?

string[] values = { "1", "hello", "true" };
Type[] types = { typeof(int), typeof(string), typeof(bool) };

object[] objects = new object[values.Length];

for (int i = 0; i < values.Length; i++)
{
    objects[i] = Convert.ChangeType(values[i], types[i]);
}

3 个答案:

答案 0 :(得分:27)

.NET 4有一个Zip运算符,允许您将两个集合连接在一起。

var values = { "1", "hello", "true" };
var types = { typeof(int), typeof(string), typeof(bool) };
var objects = values.Zip(types, (val, type) => Convert.ChangeType(val, type));

.Zip方法优于.Select((s,i)=&gt; ...)因为.Select会在你的集合没有相同数量的元素时抛出异常,而.Zip会简单拉链尽可能多的元素。

如果您使用的是.NET 3.5,那么您将不得不接受。选择,或编写自己的.Zip方法。

现在,所有这一切,我从未使用过Convert.ChangeType。我假设它适用于你的场景,所以我会留下它。

答案 1 :(得分:6)

假设两个阵列的大小相同:

string[] values = { "1", "hello", "true" };
Type[] types = { typeof(int), typeof(string), typeof(bool) };

object[] objects = values
    .Select((value, index) => Convert.ChangeType(value, types[index]))
    .ToArray();

答案 2 :(得分:4)

object[] objects = values.Select((s,i) => Convert.ChangeType(s, types[i]))
                         .ToArray();