繁体   English   中英

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

[英]How to get a dimension (slice) from a multidimensional array

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

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

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

不。您当然可以编写一个表示切片的包装类,并在内部有一个索引器 - 但没有内置。 另一种方法是编写一个方法来复制切片并返回一个向量——这取决于你是否想要一个副本

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]);
        }
    }
}

该答案的改进版本:

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];
    }
}

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM