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

3

我正在使用以下代码将列表中的列表转换为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;
}

3
int[][] 是不规则数组。 - FaizanHussainRabbani
我认为最好的方法就是使用for循环。 - Evk
@mjwills,我不确定你在指什么,因为我没有遇到任何问题。 - Luna
@FaizanRabbani 我正在添加这个方法。现在完成了。 - Luna
谢谢,我删除了我的评论。 - FaizanHussainRabbani
请参考此链接:https://dev59.com/6ITba4cB1Zd3GeqP1yTZ#26291720 - FaizanHussainRabbani
2个回答

5
什么是将int[][]转换为int[,]的最佳方法?可以参考post中描述的方法。如果所有子数组具有相同的Length,则您的方法也可以正常工作。但是引用你的话说:“不幸的是,我的数组不是矩形的。”那么尝试转换就没有太多意义了,除非你失去值或添加值以使所有子数组的维数相等。但是你代码中的问题不在于这个转换,而在于这个: 我正在使用以下方式将列表内的列表转换为int[][]:int[][] preConvertInts = processedList.Select(array => array.ToArray().ToArray()) as int[][]; 这是错误的。如果检查Select调用的返回值,则preConvertInts将为null

enter image description here

您可以看到它返回的是 IEnumerable<int[]> 而不是 int[][]。使用 as int[][]; 进行转换无效,只会掩盖这两种类型在编译器中不同的事实。您所做的是将每个子列表转换为数组,然后再次简单地将(已转换的数组)转换为数组。

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

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
很好,点赞了因为我正在吃冰淇淋,它太棒了。 - TheGeneral
@MichaelRandall 祝你用餐愉快 - Mong Zhu
@MichaelRandall 我在图片上添加了一个手绘的圆圈和箭头,让它更加棒了 ;) - Mong Zhu
1
如果我可以投票支持那个箭头,我会这么做。 - TheGeneral
@Joris 很高兴听到它有所帮助。你可以考虑将其标记为已接受 :) 祝编码愉快 - Mong Zhu
显示剩余2条评论

2

不规则数组

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 Zhu

锯齿数组

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

注意:完全未经测试


@MongZhu 我不知道! - TheGeneral
@MongZhu 谢谢你的帮助 :) - TheGeneral
ToMultiArray 函数中,你也可以在一开始检查所有子数组维度: if (arrays.Select(x => x.Count()).Distinct().Count() > 1) 如果维度不符合条件,则可以跳过整个迭代。 - Mong Zhu
这些方法很有用。不幸的是,我的数组不是矩形的。 - Luna
1
@m.rogalski 我猜在这个例子中,多版本期望相同的长度,但你提出了一个很好的观点,它可以只创建最大的出现并默认缺失的类型。 - TheGeneral
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接