C#:是否可以使用扩展方法获取3D阵列的2D切片?

C#:是否可以使用扩展方法获取3D阵列的2D切片?,c#,C#,基于这两篇文章(和),我理解可能可以编写自己的扩展方法,从3D阵列中获取2D切片。我正在使用三维阵列,它们以以下方式表示空间数据:[层、行、列]。我希望对层索引进行切片,以便获得所选层的所有行、列和列的2D数组。但是,我还没有找到从扩展方法返回2D数组的方法。以下是我到目前为止尝试过的内容,但正如注释//Error:…: double[,,] hds // 3D array of values double[,] lay_hd; // 2D slice to be filled by ex

基于这两篇文章(和),我理解可能可以编写自己的扩展方法,从3D阵列中获取2D切片。我正在使用三维阵列,它们以以下方式表示空间数据:
[层、行、列]
。我希望对层索引进行切片,以便获得所选层的所有
行、列和列的2D数组。但是,我还没有找到从扩展方法返回2D数组的方法。以下是我到目前为止尝试过的内容,但正如注释
//Error:…
:

double[,,] hds    // 3D array of values
double[,] lay_hd; // 2D slice to be filled by extension method

for(int k = 0; k < nlay; k++)
{
    lay_hd = gwhds.SliceLayer(k);  // Error: Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<double>' to 'double[*,*]'
    // write 2D array to text file...
}

public static IEnumerable<T> SliceLayer<T>(this T[,,] array, int lay)
{
    for (var i = array.GetLowerBound(1); i <= array.GetUpperBound(1); i++)
    {
        for (var j = array.GetLowerBound(2); j <= array.GetUpperBound(2); j++)
        {
            yield return array[lay, i, j];
        }
    }
}
double[,]hds//3D值数组
双[,]lay_hd;//用扩展方法填充的二维切片
for(int k=0;k对于(var i=array.GetLowerBound(1);i这两篇文章表明,可以从2D数组中获得一维
IEnumerable
切片,但对于3D数组的切片,可以获得2D
IEnumerable
切片

public static IEnumerable<IEnumerable<T>> SliceLayer<T>(this T[,,] array, int lay)
{
    IEnumerable<T> SliceRow(int row) {
        for (var j = array.GetLowerBound(2); j <= array.GetUpperBound(2); j++)
        {
            yield return array[lay, row, j];
        }
    }

    for (var i = array.GetLowerBound(1); i <= array.GetUpperBound(1); i++)
    {
        yield return SliceRow(i);
    }
}

这里根本不清楚您到底在寻找什么。请解决您的问题,这样就不会有歧义。您的
SliceLayer()
方法返回一个可枚举的,但您试图将其分配给的变量是一个
double[,]
。这是行不通的。网站上已经有很多帖子解释了在这种情况下如何返回
双[,]
;如果这就是你想要的,你的问题是重复的。如果你认为不是,请解释为什么不是。
public static T[,] SliceLayer<T>(this T[,,] array, int lay)
{
    T[,] result = new T[array.GetLength(1), array.GetLength(2)];
    var lowerBound1 = array.GetLowerBound(1);
    var lowerBound2 = array.GetLowerBound(2);
    for (var i = lowerBound1; i <= array.GetUpperBound(1); i++)
    {
        for (var j = lowerBound2; j <= array.GetUpperBound(2); j++)
        {
            // you could just use i and j as indices here if the input 
            // arrays is guaranteed to have non-negative lower bounds
            result[i - lowerBound1, j - lowerBound2] = array[lay, i, j];
        }
    }
    return result;
}