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

tpo*_*pol 23 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]);
}
Run Code Online (Sandbox Code Playgroud)

Jud*_*ngo 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));
Run Code Online (Sandbox Code Playgroud)

.Zip方法优于.Select((s,i)=> ...)因为.Select会在你的集合没有相同数量的元素时抛出异常,而.Zip会简单地压缩到一起尽可能的元素.

如果你使用的是.NET 3.5,那么你必须选择.选择,或编写自己的.Zip方法.

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


Dar*_*rov 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();
Run Code Online (Sandbox Code Playgroud)


bru*_*nde 5

object[] objects = values.Select((s,i) => Convert.ChangeType(s, types[i]))
                         .ToArray();
Run Code Online (Sandbox Code Playgroud)