C# 转换二维数组

C# 转换二维数组,c#,.net,multidimensional-array,data-structures,flatten,C#,.net,Multidimensional Array,Data Structures,Flatten,什么是selectMany.ToArray()方法?它是C#中的内置方法吗 我需要将二维数组转换为一维数组。是一个投影运算符,是名称空间System.Linq提供的扩展方法 它在序列上执行一对多元素投影,允许您将结果序列“展平”为一个 您可以这样使用它: int[][] twoDimensional = new int[][] { new int[] {1, 2},

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

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

是一个投影运算符,是名称空间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();
如果你指的是锯齿状数组(
T[][]
),那么
SelectMany
就是你的朋友。但是,如果您指的是矩形数组(
T[,]
),则可以通过
foreach
-或:

int[,] from = new int[,] {{1,2},{3,4},{5,6}};
int[] to = from.Cast<int>().ToArray();
int[,]from=newint[,]{{1,2},{3,4},{5,6};
int[]to=from.Cast().ToArray();
我的解决方案:

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;
    }
}
public struct Array3D
{
公共交通变平;
int x_len;
内尤伦;
内兹伦;
公共阵列3D(整数z_len、整数y_len、整数x_len)
{
this.x_len=x_len;
this.y_len=y_len;
this.z_len=z_len;
展平=新T[z_len*y_len*x_len];
}
公共整数getOffset(整数z,整数y,整数x)=>y_len*x_len*z+x_len*y+x;
公共T这个[intz,inty,intx]{
get=>展平[y_len*x_len*z+x_len*y+x];
set=>展平[y_len*x_len*z+x_len*y+x]=值;
}
公共T此[int flat_index]{
get=>展平[展平索引];
set=>flant[flat_index]=值;
}
}

此解决方案致力于将任何类型的
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();
    }
public static int[]GetFlattenTarray(对象jaggedArray)
{
var flattedaray=新列表();
var jaggedArrayType=jaggedArray.GetType();
var expectedType=typeof(int);
if(jaggedArrayType.IsArray)
{
if(expectedType.IsAssignableFrom(jaggedArrayType.GetElementType()))
{
foreach(jaggedArray中的变量el作为int[])
{
展平阵列。添加(el);
}
}
其他的
{
foreach(jaggedArray中的变量el作为对象[])
{
foreach(GetFlattenTarray(el)中的var retIntEl)
{
展平阵列。添加(retIntEl);
}
}
}
}
else if(jaggedArrayType==expectedType)
{
添加((int)jaggedArray);
}
其他的
{
返回新整数[0];
}
返回flattedArray.ToArray();
}

用这把小提琴试试:

学究点;这不是我所说的二维数组——这是一个锯齿状数组…@MarcGravel,这不是一个二维锯齿状数组吗?显然,锯齿阵列不是矩形阵列或“立方体”阵列。但它仍然有一定的维度。说2D数组没有指定锯齿形或几何/直线。@也许是barlop,但这里的“数组”最终会指外部数组,它是一个参考向量;锯齿状确实表明它更复杂,我同意在某些方面可以使用“2D”,而不是,比如说,
int[][]
。归根结底,命名很难:)@marcGravel不知道你为什么要使用
int[][]
。我并不是说他可以用不同的方式来实现一些东西。我想说的是一个数组的数组,是一个二维数组,即使数组是锯齿状的。当我提到立方体时,它有点不必要,但我的观点是3D锯齿阵列不是立方体,但它仍然是三维的。正如二维锯齿阵列不是矩形阵列,但它仍然有二维。称它为2D并不排除它是锯齿状的。我还谈到了我们是如何将outter数组称为您也是。@MarcGravel是的,我并不否认这一点。内存是线性的,一维的,也许可以说是二维的。但绝对不是3D的。多维数组的概念是一种抽象。我不知道
[,]
或[,,,]`数组是如何存储的,但即使它不是以数组的数组形式存储的,多维数组作为抽象的观点也适用于那些矩形或“立方体”数组。您使用的术语是基于抽象概念的,如锯齿阵列,您提到2D阵列表明您接受该抽象术语。所以我不知道你为什么要提到你是什么。这个线程详细介绍了foreach方法,以及一些性能指标。我不知道
int[,]
通过
Cast()
转换成
IEnumerable
。酷把戏!请记住,如果中的
为只读,则此方法将失败。@Chmielok这里有一个示例说明您的意思吗?如果来自
是只读字段,它应该可以正常工作;AFAIK
ImmutableArray
只支持向量;那么:您所描述的失败场景是什么?这与以下问题有什么关系:
将二维数组转换为一维数组
?在1d数组类上使用2d数组,那么您就可以轻松地“转换”为1d数组而无需性能缺陷更改为2d非常简单