【问题标题】:How to concatenate two collections by index in LINQ如何在 LINQ 中按索引连接两个集合
【发布时间】:2011-01-18 08:59:54
【问题描述】:

什么可能是与以下代码等效的 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]);
}

【问题讨论】:

    标签: c# linq collections join


    【解决方案1】:

    .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) => ...) 因为 .Select 会在您的集合没有相同数量的元素时抛出异常,而 .Zip 只会压缩尽可能多的元素。

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

    现在,说了这么多,我从未使用过 Convert.ChangeType。我假设它适用于您的场景,所以我会保留它。

    【讨论】:

    • 或者简单地说:var objects = values.zip(types, (v,t) =&gt; Convert.ChangeType(v, t));
    【解决方案2】:

    假设两个数组的大小相同:

    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();
    

    【讨论】:

      【解决方案3】:
      object[] objects = values.Select((s,i) => Convert.ChangeType(s, types[i]))
                               .ToArray();
      

      【讨论】:

        猜你喜欢
        • 2022-07-28
        • 2019-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多