代码之家  ›  专栏  ›  技术社区  ›  Graviton

从List<double[]>转换为double[,]

  •  5
  • Graviton  · 技术社区  · 14 年前

    有没有一个线性(无循环)转换 List<double[]> double[,] ?

    5 回复  |  直到 14 年前
        1
  •  5
  •   Dirk Vollmar    14 年前

    转换为 double[,] 只能通过循环遍历列表来完成,并且要求列表中包含的所有数组的大小相同:

    double[,] arr = new double[list.Count, list[0].Length];
    for (int i = 0; i < list.Count; i++)
    {
        for (int j = 0; j < list[0].Length; j++)
        {
            arr[i, j] = list[i][j];
        }
    }
    

    当然,您可以轻松创建锯齿状 double[][] .ToArray() :

    double[] array = new double[] { 1.0, 2.0, 3.0 };
    double[] array1 = new double[] { 4.0, 5.0, 6.0 };
    
    List<double[]> list = new List<double[]>();
    list.Add(array);
    list.Add(array1);
    
    double[][] jaggedArray = list.ToArray();
    
        2
  •  3
  •   abatishchev Marc Gravell    14 年前

    好吧,如果没有循环,你可能无法实现它,但是你可以让 使用 一行:

    double[,] array = list.To2DArray();
    

    To2DArray 扩展方法实现如下:

    public static class ExtensionMethods
    {
        public static T[,] To2DArray<T>(this IEnumerable<IEnumerable<T>> source)
        {
            var jaggedArray = source.Select(r => r.ToArray()).ToArray();
            int rows = jaggedArray.GetLength(0);
            int columns = jaggedArray.Max(r => r.Length);
            var array = new T[rows, columns];
            for (int i = 0; i < rows; i++)
            {
                for (int j = 0; j < jaggedArray[i].Length; j++)
                {
                    array[i, j] = jaggedArray[i][j];
                }
            }
            return array;
        }
    }
    

    注意,它只在C#4中工作,因为早期版本不支持协方差。这个变体应该在C#3中工作,但它更具体:

    public static T[,] To2DArray<T>(this IEnumerable<T[]> source)
    {
        var jaggedArray = source.ToArray();
        // same code from here
    }
    
        3
  •  0
  •   Miserable Variable    14 年前

    如果要从1个dim数组的列表创建2个dim数组,则需要循环,尽管在调用站点上看起来可能不是这样。

        4
  •  0
  •   abatishchev Marc Gravell    14 年前
    public static T[,] ToMultidimensional<T>(this T[][] arr, int maxSize)
    {
        T[,] md = (T[,])Array.CreateInstance(typeof(double), arr.Length, maxSize);
    
        for (int i = 0; i < arr.Length; i++)
        for (int j = 0; j < arr[i].Length; j++)
            md[i, j] = arr[i][j];
    
        return md;
    }
    
    var arr = new List<double[]>
    {
        new double[] { 1, 2, 3 },
        new double[] { 4, 5 }
    }
    .ToArray();
    
    var j = arr.ToMultidimensional(arr.Max(a => a.Length));
    
        5
  •  0
  •   Sam Saarian    11 年前

    此语法应适用于: