将锯齿状数组转换为多维数组

时间:2018-02-15 11:16:34

标签: c#

我正在使用以下内容将列表中的列表转换为int[][]

int[][] preConvertInts = processedList.Select(array => array.ToArray().ToArray()) as int[][];

我在我的方法中返回int[,]。将int[][]转换为int[,]的最佳方式是什么?

编辑:方法

public static int[,] GetIntArrayInts(string dataString){
    string data = dataString;
    data = data.Replace(Environment.NewLine, "\n");

    List<List<int>> processedList = new List<List<int>>();

    string[] rows = data.Split('\n');
    foreach (string row in rows){
        string[] columns = row.Split(',');
        List<int> ints = new List<int>();
        foreach (string column in columns){
            if (int.TryParse(column, out int tileGid)) ints.Add(tileGid);
        }
        processedList.Add(ints);
    }
    int[][] preConvertInts = processedList.Select(array => array.ToArray().ToArray()) as int[][];
    int[,] processedIntArray =  new int[preConvertInts[0].Length, preConvertInts[1].Length];
    for (int i = 0; i < preConvertInts.Length; i++){
        int[] intArray = preConvertInts[i];
        for (int j = 0; j < intArray.Length; j++){
            processedIntArray[i, j] = preConvertInts[i][j];
        }
    }
    return processedIntArray;
}

2 个答案:

答案 0 :(得分:4)

  

将int [] []转换为int [,]?

的最佳方法是什么?

这是post中描述的那个。如果所有子阵列具有相同的Length,那么您的实际工作也会有效。但要引用你:

  

不幸的是,我的数组不是矩形的。 - Luna

然后尝试转换它没有多大意义。除非您丢失值或添加值以使所有子数组的维度相等。

但是代码中的问题不是此转换,而是这个

  

我正在使用以下内容将列表中的列表转换为int[][]   int[][] preConvertInts = processedList.Select(array => array.ToArray().ToArray()) as int[][];

这是错误的。 null您将获得preConvertInts!如果您检查Select电话的返回值:

enter image description here

您可以看到它返回IEnumerable<int[]>而不是int[][]。使用as int[][];进行转换不起作用,并且仅掩盖2种类型与编译器不同的事实。你做的是将每个子列表转换为一个数组,然后再将(已转换的数组)转换成一个数组。

您需要以正确的方式进行选择:

int [][] preConvertInts = processedList.Select(x=>x.ToArray()).ToArray();

说明:

1)在第一步中,您收集所有子列表并将每个子列表转换为数组:Select(x=>x.ToArray())

2)现在此调用返回IEnumerable<int[]>,您需要将其再次转换为数组:

Select(x=>x.ToArray()).ToArray();
                     ^^
                     ||
    note the dot behind the closing parentesis of the Select call

答案 1 :(得分:0)

锯齿状阵列

public static T[,] ToMultiArray<T>(this IList<T[]> arrays)
{
    var length = arrays[0].Length;
    var result = new T[arrays.Count, length];
    for (var i = 0; i < arrays.Count; i++)
    {
        var array = arrays[i];
        if (array.Length != length)
        {
            throw new ArgumentException("Misaligned arrays");
        }

        for (var j = 0; j < length; j++)
        {
            result[i, j] = array[j];
        }
    }

    return result;
}

多维数组

public static T[][] ToJaggedArray<T>(this IList<T[]> arrays)
{

    var result = new T[arrays.Count][];
    for (var i = 0; i < arrays.Count; i++)
    {
        var array = arrays[i];
        var length = array.Length;
        result[i] = new T[length];
        for (var j = 0; j < length; j++)
        {
            result[i][j] = array[j];
        }
    }

    return result;
}

<强>用法

var preConvertInts = list.ToJaggedArray();

var preConvertInts = list.ToMultiArray();

更新

  

this IList<T[]> arrays此方法适用于包含数组的列表,   为了适应OP的例子,它应该是(this IList<List<T>> arrays) - Mong   诸

锯齿状阵列

public static T[][] ToJaggedArray<T>(IList<List<T>> arrays)
{

    var result = new T[arrays.Count][];
    for (var i = 0; i < arrays.Count; i++)
    {
        var array = arrays[i];
        var length = array.Count;
        result[i] = new T[length];
        for (var j = 0; j < length; j++)
        {
            result[i][j] = array[j];
        }
    }

    return result;
}

多维数组

public static T[,] ToMultiArray<T>(IList<List<T>> arrays)
{
    var length = arrays[0].Count;
    var result = new T[arrays.Count, length];
    for (var i = 0; i < arrays.Count; i++)
    {
        var array = arrays[i];
        if (array.Count != length)
        {
            throw new ArgumentException("Misaligned arrays");
        }

        for (var j = 0; j < length; j++)
        {
            result[i, j] = array[j];
        }
    }

    return result;
}

注意 :完全未经测试