如何从多维数组中获取维度(切片)

Posted

技术标签:

【中文标题】如何从多维数组中获取维度(切片)【英文标题】:How to get a dimension (slice) from a multidimensional array 【发布时间】:2011-06-15 16:15:57 【问题描述】:

我试图弄清楚如何从多维数组中获取单维(为了论证,假设它是二维的),我有一个多维数组:

double[,] d = new double[,]   1, 2, 3, 4, 5 ,  5, 4, 3, 2, 1  ;

如果它是一个锯齿状数组,我会简单地调用d[0],这会给我一个1, 2, 3, 4, 5 的数组,有没有办法用二维数组实现同样的效果?

【问题讨论】:

听起来您想创建一个引用数组切片的数组。我认为这是不可能的。 @Gabe,是的,我查看了文档,但没有看到任何可以帮助我获得切片的内容,所以我决定与社区确认。谢谢(你的)信息! :) 我刚刚注意到我的问题是重复的:***.com/questions/1406083/array-slice-in-c 【参考方案1】:

没有。您当然可以编写一个代表切片的包装类,并在内部有一个索引器 - 但没有内置任何内容。另一种方法是编写一个方法,该方法制作一个切片的副本并返回一个向量 - 这取决于您是否需要 副本

using System;
static class ArraySliceExt

    public static ArraySlice2D<T> Slice<T>(this T[,] arr, int firstDimension)
    
        return new ArraySlice2D<T>(arr, firstDimension);
    

class ArraySlice2D<T>

    private readonly T[,] arr;
    private readonly int firstDimension;
    private readonly int length;
    public int Length  get  return length;  
    public ArraySlice2D(T[,] arr, int firstDimension)
    
        this.arr = arr;
        this.firstDimension = firstDimension;
        this.length = arr.GetUpperBound(1) + 1;
    
    public T this[int index]
    
        get  return arr[firstDimension, index]; 
        set  arr[firstDimension, index] = value; 
    

public static class Program

    static void Main()
    
        double[,] d = new double[,]   1, 2, 3, 4, 5 ,  5, 4, 3, 2, 1  ;
        var slice = d.Slice(0);
        for (int i = 0; i < slice.Length; i++)
        
            Console.WriteLine(slice[i]);
        
    

【讨论】:

感谢您的信息...在没有找到任何内置内容后,我认为我必须编写一个包装器,但我想确保我没有错过任何东西。再次感谢! (你明白了,别介意右手评论) -- 干得好,+1【参考方案2】:

that answer的改进版:

public static IEnumerable<T> SliceRow<T>(this T[,] array, int row)

    for (var i = array.GetLowerBound(1); i <= array.GetUpperBound(1); i++)
    
        yield return array[row, i];
    


public static IEnumerable<T> SliceColumn<T>(this T[,] array, int column)

    for (var i = array.GetLowerBound(0); i <= array.GetUpperBound(0); i++)
    
        yield return array[i, column];
    

【讨论】:

正是我需要的。 IEnumerable。【参考方案3】:

矩形数组不是为此目的而构建的。如果您需要这种类型的功能,您应该切换到锯齿状阵列。编写一个将矩形数组转换为锯齿状数组的函数非常简单。

您还可以通过在适当的维度上调用 GetLength(int dimension) 来简单地重建该数组,然后正确地对其进行索引以检索每个值。它会比转换整个数组便宜,但最便宜的选择是将其更改为使用锯齿状数组。

【讨论】:

您写道“编写一个将矩形数组转换为锯齿状数组的函数非常简单。” 【参考方案4】:

这应该复制锯齿状数组的 a[r] 功能:

T[] Slice<T>(T[,] a, int r) => Enumerable.Range(0, a.GetUpperBound(1) + 1).Select(i => a[r, i]).ToArray();

【讨论】:

以上是关于如何从多维数组中获取维度(切片)的主要内容,如果未能解决你的问题,请参考以下文章

C#中如何获取一个二维数组的两维长度,即行数和列数?以及多维数组各个维度的长度?

Java中如何获取多维数组的长度

获取多维数组的维度

text 获取多维数组的切片

python如何减小维度

如何获取多维数组的宽高?