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

时间:2010-08-23 08:57:53

标签: c# arrays

是否存在将List<double[]>转换为double[,]的单行(无循环)?​​

5 个答案:

答案 0 :(得分:5)

转换为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();

答案 1 :(得分:3)

好吧,你可能无法在没有循环的情况下实现它,但你可以使用法成为一个单行:

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
}

答案 2 :(得分:0)

如果要从1个dim数组的List创建2 dim数组,则需要循环,尽管它可能在调用站点看起来不像。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

此语法应该有效: 返回新列表{new double [] {m​​inX,minY},new double [] {m​​axX,maxY}};