【问题标题】:LINQ and Array.CopyLINQ 和 Array.Copy
【发布时间】:2012-11-07 21:04:04
【问题描述】:

我有以下几点:

var list = new List<double[]>();
list.Add(new double[] { 300, 12, 22 });
list.Add(new double[] { 310, 13, 23 });
list.Add(new double[] { 320, 14, 24 });
list.Add(new double[] { 330, 15, 25 });

我想从中得到一个包含前 2 列的多维数组:

double[,] a = { {300,12}, {310,13}, {320,14}, {330,15}}

我可以使用 linq 做到这一点吗?怎么做?

【问题讨论】:

    标签: c# arrays linq multidimensional-array


    【解决方案1】:

    试试下面的

    var a = list.Select(x => new [] { x[0], x[1] }).ToArray();
    

    编辑

    起初并没有意识到其意图是从源中获取非锯齿状二维数组。不幸的是,使用标准 LINQ 方法并没有真正的方法来做到这一点。他们主要处理IEnumerable&lt;T&gt;T[]。但是,没有什么能阻止您创建一个新方法来执行此操作

        public static T[,] ToMultidimensionArray<T>(this List<T[]> list, int columns)
        {
            var array = new T[list.Count, columns];
            for (int i = 0; i < list.Count; i++)
            {
                var source = list[i];
                for (int j = 0; j < columns; j++)
                {
                    array[i, j] = source[j];
                }
            }
    
            return array;
        }
    

    现在您可以通过简单的查询来转换原始列表

    var a = list.ToMultidimensionArray(2);
    

    【讨论】:

    • 这将创建一个double[][] 而不是double[,]
    【解决方案2】:

    LINQ 和多维数组不能很好地混合。 Array.Copy 在这里也不适用。

    使用传统的for 循环:

    double[,] result = new double[list.Count, 2];
    
    for (int i = 0; i < list.Count; i++)
    {
        result[i, 0] = list[i][0];
        result[i, 1] = list[i][1];
    }
    

    【讨论】:

      【解决方案3】:
      public static T[,] GetColumns<T>(IList<IEnumerable<T>> source, int numColumns)
      {
          T[,] output = new T[source.Count, numColumns];
      
          for (int i = 0; i < source.Count; i++)
          {
              int j = 0;
              foreach (T item in source[j].Take(numColumns))
              {
                  output[i, j] = item;
                  j++;
              }
          }
      
          return output;
      }
      

      请注意,在这种情况下,如果任何列表包含的数组没有足够的值来填充您想要的所有列,那么它们将保留默认值,它不会引发异常。如果您希望发生这种情况,您需要检查并自己扔一个。

      【讨论】:

        【解决方案4】:
        var array = list.Select(item => item.Take(2).ToArray()).ToArray();
        foreach (var item in array)
        {
            Console.WriteLine("{0}, {1}", item[0], item[1]);
        }
        

        【讨论】:

        • 这将创建一个double[][] 而不是double[,]
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多