我想弄清楚如何从多维数组中获取单维(为了参数,我们假设它是2D),我有一个多维数组:如何从多维数组中获得维(切片)
double[,] d = new double[,] { { 1, 2, 3, 4, 5 }, { 5, 4, 3, 2, 1 } };
如果这是一个交错数组,我会简单地调用d[0]
这将让我的{1, 2, 3, 4, 5}
数组,是有办法,我可以实现与二维数组一样吗?
我想弄清楚如何从多维数组中获取单维(为了参数,我们假设它是2D),我有一个多维数组:如何从多维数组中获得维(切片)
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]);
}
}
}
感谢您的信息...后没有发现任何内置我假设我'我必须写一个包装,但我想确保我没有错过任何东西。再次感谢! – Kiril
@Lirik查看样例更新 –
_(你知道了,别介意右手评论)_ - 干得好,+1 –
矩形阵列不是为此目的而构建的。如果你需要这种类型的功能,你应该切换到一个锯齿状的数组。编写一个将矩形数组转换为锯齿形的函数非常简单。
您也可以通过调用适当维度上的GetLength(int dimension)来重建该数组,然后正确索引它以检索每个值。它会比转换整个数组便宜,但最便宜的选择是将其更改为使用锯齿状数组。
你写道:“编写一个将矩形数组转换为锯齿形函数的函数非常简单。” <---但是如果一个大数组可能效率很低,因为你必须扫描整个数组?如何将矩形转换为锯齿而不重建它? – barlop
的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的。 – realPT
这听起来像你想创建引用数组的一个切片的数组。我不认为这是可能的。 – Gabe
@加贝,嗯,我查看了文档,看不到任何能帮助我获得分数的东西,所以我决定向社区确认。谢谢(你的)信息! :) – Kiril
我只注意到我的问题是重复的:http://stackoverflow.com/questions/1406083/array-slice-in-c – Kiril