我正在试图弄清楚如何从多维数组中获取单个维度(为了论证,让我们说它是2D),我有一个多维数组:
double[,] d = new double[,] { { 1, 2, 3, 4, 5 }, { 5, 4, 3, 2, 1 } };
如果它是一个锯齿状的数组,我只需要调用d[0]
,这会给我一个{1, 2, 3, 4, 5}
数组,有没有办法可以用2D数组实现相同的效果?
答案 0 :(得分:21)
没有。您当然可以编写一个表示切片的包装器类,并在内部有一个索引器 - 但没有内置任何内容。另一种方法是编写一个方法,对切片进行复制并交回一个向量 - 这取决于您是否需要副本。
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 :(得分:9)
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];
}
}
答案 2 :(得分:3)
不为此目的构建矩形数组。如果您需要这种类型的功能,则应切换到锯齿状阵列。编写一个将矩形数组转换为锯齿状数组的函数非常简单。
您也可以通过在适当的维度上调用GetLength(int dimension)来简单地重建该数组,然后正确地索引它以检索每个值。它比转换整个阵列便宜,但最便宜的选择是改变它以使用锯齿状阵列。
答案 3 :(得分:1)
这应该复制锯齿数组的a [r]功能:
T[] Slice<T>(T[,] a, int r) => Enumerable.Range(0, a.GetUpperBound(1) + 1).Select(i => a[r, i]).ToArray();