C# 使用LINQ获取多维数组的分区((N-1)-多维数组的多维实例)

C# 使用LINQ获取多维数组的分区((N-1)-多维数组的多维实例),c#,linq,C#,Linq,我想从3d阵列中获取2d阵列。假设我有一个尺寸为[10,10,10]的双3d数组A3 我需要得到一个2d数组A2=A3[:,5,:],即第二维度的索引等于,例如5 如果我想获得2d数组A2的分区(例如A1=A2[2,:])(即2d数组的1d实例),我可以这样做(第1维的索引设置为2): 如何从3维到2维(或通常从N维到N-1维)进行计算 编辑。输入示例: double[,,] A3 = new double[2,3,4]{ { {4,3,2

我想从3d阵列中获取2d阵列。假设我有一个尺寸为[10,10,10]的双3d数组A3
我需要得到一个2d数组A2=A3[:,5,:],即第二维度的索引等于,例如5

如果我想获得2d数组A2的分区(例如A1=A2[2,:])(即2d数组的1d实例),我可以这样做(第1维的索引设置为2):

如何从3维到2维(或通常从N维到N-1维)进行计算

编辑。输入示例:

double[,,] A3 = new double[2,3,4]{
            {
                {4,3,2,1},
                {5,4,3,2},
                {6,5,4,3}
            },
            {
                {1,2,3,4},
                {2,3,4,5},
                {3,4,5,6}
            }
        };

结果数组A2=A3[:,1,:]必须具有以下内部结构:{5,4,3,2},{2,3,4,5}

LINQ通常不能很好地处理多维数组。这些操作本质上是一维的。它在嵌套的一维数组中表现得更好,因此如果您想要返回深度为2的锯齿状数组,即
double[][]
而不是
double[,]
LINQ是一个更合适的工具

public static T[][] GetPlane<T>(T[, ,] source, int secondDimensionValue)
{
    return Enumerable.Range(0, source.GetLength(0))
        .Select(i => Enumerable.Range(0, source.GetLength(2))
            .Select(j => source[i, secondDimensionValue, j])
            .ToArray())
        .ToArray();
}
publicstatict[]GetPlane(T[,]source,intseconddimensionvalue)
{
返回可枚举的.Range(0,source.GetLength(0))
.Select(i=>Enumerable.Range(0,source.GetLength(2))
.选择(j=>source[i,secondDimensionValue,j])
.ToArray())
.ToArray();
}

类似的内容应该适用于3->2:

static T[][]折叠(T[][]数组,int-y)
{
返回
Enumerable.Range(0,array.Length)。选择(x=>
可枚举。范围(0,数组[x][y]。长度)。选择(z=>
数组[x][y][z]
).ToArray()
).ToArray();
}
如何将这种模式扩展到更高维度的问题应该是相当明显的

编辑:

这以预期的方式扩展到多维数组。如果您对返回多维数组(与锯齿数组相反)感兴趣,那么LINQ可能不是解决此问题的工具,因为它没有提供处理多维数组创建的明显或直观的方法

如果您真的希望多维数组作为输出,我已经包含了一个示例“去毛刺”实现,它应该将其折叠回多维(非锯齿)数组

static T[][]折叠(T[,]数组,int-y)
{
返回
Enumerable.Range(0,array.GetLength(0))。选择(x=>
Enumerable.Range(0,array.GetLength(2))。选择(z=>
数组[x,y,z]
).ToArray()
).ToArray();
}
静态T[,]去毛刺(T[]锯齿状)
{
T[,]mArray=newt[jagged.Length,jagged.Max(数组=>array.Length)];
foreach(可枚举.Range(0,锯齿状.Length)中的int行)
foreach(可枚举范围中的整数列(0,锯齿状[行].Length))
马拉伊[行,列]=锯齿状[行][列];
返回玛丽;
}

您的分区大小相同,还是参差不齐?为什么需要Linq?只需编写循环就可以轻松完成(可能运行得也更快)。只要写一个扩展方法就可以了,Bob是你的叔叔!尺寸不相等,可能是[2,17,5];人们总是可以编写循环或函数来代替LINQ。此外,假设知道如何完成这项任务,我可以轻松地将此方法扩展到其他多维对象。这就是为什么我要问秩长度-如果它们都相等,您可以在there@JerKimball请注意,即使维度的长度不相等,它也不是锯齿状数组。锯齿状数组是指单个维度的长度不是常数,这在多维数组中是不可能的。它可以工作的,谢谢,你能告诉我如何将其作为[,]数组而不是(“锯齿状”?)[]数组吗?@MaxLi到目前为止,最简单的方法是完全废弃LINQ,只使用常规循环。在开始时创建适当大小的多维数组,让一个双
for
循环遍历更改的两个维度,然后在循环体中设置数组的相关值。@MaxLi,您不会使用LINQ生成多维数组,因此,如果在返回一个不带linq的多维数组和一个带linq的锯齿数组之间进行选择,我选择后者。你能把编辑文章的示例输入放到你的函数中吗?我将[][]改为[,]等,但仍然无法运行我已更新了答案以包含多维示例。
public static T[][] GetPlane<T>(T[, ,] source, int secondDimensionValue)
{
    return Enumerable.Range(0, source.GetLength(0))
        .Select(i => Enumerable.Range(0, source.GetLength(2))
            .Select(j => source[i, secondDimensionValue, j])
            .ToArray())
        .ToArray();
}