转换二维数组

Posted

技术标签:

【中文标题】转换二维数组【英文标题】:Convert 2 dimensional array 【发布时间】:2010-10-13 02:14:13 【问题描述】:

selectMany.ToArray() 方法是什么?它是C# 中的内置方法吗?

我需要将二维数组转换为一维数组。

【问题讨论】:

【参考方案1】:

如果您的意思是 锯齿状 数组 (T[][]),SelectMany 是您的朋友。但是,如果您的意思是 rectangular 数组 (T[,]),那么您可以通过 foreach 枚举日期数据 - 或:

int[,] from = new int[,] 1,2,3,4,5,6;
int[] to = from.Cast<int>().ToArray();

【讨论】:

这个线程 ***.com/questions/5132397/… 详细介绍了执行 foreach 方法以及一些性能指标。 我不知道int[,]Cast() 转换为IEnumerable&lt;int&gt;。很酷的把戏! 请记住,如果from 是只读的,则此方法将失败。 @Chmielok 你是什么意思的例子吗?如果from 是只读字段,它应该可以正常工作;而 AFAIK ImmutableArray&lt;T&gt; 仅支持向量;所以:你描述的是什么场景失败了?【参考方案2】:

SelectMany 是一个投影算子,由命名空间 System.Linq 提供的扩展方法。

它在序列上执行一对多元素投影,允许您将结果序列“扁平化”为一个。

你可以这样使用:

int[][] twoDimensional = new int[][]  
                                      new int[] 1, 2,
                                      new int[] 3, 4,
                                      new int[] 5, 6
                                     ;

int [] flattened = twoDimensional.SelectMany(x=>x).ToArray();

【讨论】:

学究点;这不是我所说的二维数组——它是一个锯齿状数组…… @MarcGravell 不是二维锯齿状数组吗?显然,锯齿状阵列不是矩形阵列或“立方体”阵列。但它仍然具有一定的维度。要说二维数组没有指定锯齿状或几何/直线。 @barlop 也许,但最终这里的“数组”指的是外部数组,它是一个引用向量;锯齿确实清楚地表明它更复杂,我同意在某些方面可以使用“2D”,而不是int[][][]。最终,命名很难:) @MarcGravell 不知道你为什么提到int[][][]。我并不是真的在谈论他可以实现某些东西的不同方式。我要说的是数组的数组是二维数组,即使数组的数组是锯齿状的。当我提到立方体时,它有点不必要,但我的意思是 3D 锯齿状数组不是立方体,但它仍然是 3 维。正如 2D 锯齿状阵列不是矩形阵列一样,但它仍然具有 2 个维度。称它为 2D 并不排除它是锯齿状的。我也在谈论我们如何像你一样引用那个外部数组。 @MarcGravell 是的,我不否认这一点。记忆是线性的,一维的,也许可以说是二维的。但绝对不是3D。多维数组的概念是一种抽象。我不知道如何存储 [,] 或 [,,,]` 数组,但即使它不存储为数组数组,关于多维数组作为抽象的点对于那些矩形或 '多维数据集的数组。您正在使用基于抽象概念的术语,例如锯齿状数组,并且您提到 2D 数组表明您接受该抽象术语。所以我不知道你为什么提到你是什么【参考方案3】:

此解决方案专门用于转换任何类型的int 数组、常规、锯齿状、嵌套这些最后取自 javascript 及其对象表示法,但它们也可以在 C# 中实现为复杂的交错对象数组),转换为简单的一维整数数组:

    public static int[] getFlattenedIntArray(object jaggedArray)
    

        var flattenedArray = new List<int>();

        var jaggedArrayType = jaggedArray.GetType();
        var expectedType = typeof(int);

        if (jaggedArrayType.IsArray)
        
            if (expectedType.IsAssignableFrom(jaggedArrayType.GetElementType()))
            
                foreach (var el in jaggedArray as int[])
                
                    flattenedArray.Add(el);
                
            
            else
            
                foreach (var el in jaggedArray as object[])
                
                    foreach (var retIntEl in getFlattenedIntArray(el))
                    
                        flattenedArray.Add(retIntEl);
                    
                

            
        
        else if (jaggedArrayType == expectedType)
        
            flattenedArray.Add((int)jaggedArray);
        
        else
        
            return new int[0];
        

        return flattenedArray.ToArray();
    

用这个小提琴试试看:https://dotnetfiddle.net/5HGX96

【讨论】:

【参考方案4】:

我的解决方案:

public struct Array3D<T>

    public T[] flatten;
    int x_len;
    int y_len;
    int z_len;

    public Array3D(int z_len, int y_len, int x_len)
    
        this.x_len = x_len;
        this.y_len = y_len;
        this.z_len = z_len;
        flatten = new T[z_len * y_len * x_len];
    

    public int getOffset(int z, int y, int x) => y_len * x_len * z + x_len * y + x;

    public T this[int z, int y, int x] 
        get => flatten[y_len * x_len * z + x_len * y + x];
        set => flatten[y_len * x_len * z + x_len * y + x] = value;
    

    public T this[int flat_index] 
        get => flatten[flat_index];
        set => flatten[flat_index] = value;
    

【讨论】:

这与问题有什么关系:convert two dimensional array to one dimensional array? 在 1d 数组类上使用 2d 数组,然后您可以轻松“转换”为 1d 数组而不会降低性能 改成二维很容易

以上是关于转换二维数组的主要内容,如果未能解决你的问题,请参考以下文章

opencv由二维数组转换图像问题

JS二维数组转换一维数组

js怎样将一维数组转换成二维数组

二维数组转换算法,最好是js,或者其他语言也行。

PHP二维数组转换成一维数组,一个变量多个二维数组转换成一维数组,PHP二维数组(或任意维数组)转换成一维数组的方法汇总,array_reduce(); array_walk_recursive()

(java) ArrayList 分解,结果转换成 二维数组!!!