matriz - multidimensional array c# examples
Cómo obtener una dimensión(porción) de una matriz multidimensional (3)
Estoy intentando descubrir cómo obtener una única dimensión de una matriz multidimensional (por razones de argumento, digamos que es 2D), tengo una matriz multidimensional:
double[,] d = new double[,] { { 1, 2, 3, 4, 5 }, { 5, 4, 3, 2, 1 } };
Si fuera una matriz irregular, simplemente llamaría a d[0]
y eso me daría una serie de {1, 2, 3, 4, 5}
, ¿hay alguna manera de lograr lo mismo con una matriz 2D?
Las matrices rectangulares no están construidas para este propósito. Si necesita ese tipo de funcionalidad, debe cambiar a una matriz dentada. Es bastante simple escribir una función que convertirá una matriz rectangular en una irregular.
También podría simplemente reconstruir esa matriz llamando a GetLength (dimensión int) en la dimensión adecuada y luego indizarla correctamente para recuperar cada valor. Sería más económico que convertir todo el conjunto, pero la opción más barata es cambiarlo para usar matrices irregulares.
No. Por supuesto, podría escribir una clase contenedora que represente un segmento, y tenga un indexador internamente, pero nada incorporado. El otro enfoque sería escribir un método que haga una copia de una rebanada y devuelva un vector: depende de si quiere una copia o no.
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]);
}
}
}
Versión mejorada de esa respuesta :
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];
}
}