2011-01-26 11 views
25

Estoy tratando de averiguar cómo obtener una única dimensión de una matriz multidimensional (por el bien del argumento, digamos que es 2D), tengo una matriz multidimensional :Cómo obtener una dimensión (porción) de una matriz multidimensional

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

Si era una matriz escalonada, yo simplemente llamo d[0] y que me daría una gran variedad de {1, 2, 3, 4, 5}, ¿hay alguna manera de lograr lo mismo con una matriz 2D?

+1

Suena como que desea crear una matriz que hace referencia a una porción de la matriz. No creo que eso sea posible. – Gabe

+0

@Gabe, yah, revisé la documentación y no pude ver nada que me ayudara a obtener una porción, así que decidí confirmar con la comunidad. Gracias por la info! :) – Kiril

+2

Acabo de notar que mi pregunta es un duplicado: http://stackoverflow.com/questions/1406083/array-slice-in-c – Kiril

Respuesta

17

No. Por supuesto, podría escribir una clase contenedora que represente un sector, y tenga un indexador internamente, pero nada incorporado. El otro enfoque sería escribir un método que haga una copia de de un corte y devuelva un vector - depende si usted quiere 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]); 
     } 
    } 
} 
+0

gracias por la información ... después de no encontrar nada incorporado, asumí que era ' Tengo que escribir un contenedor, pero quería asegurarme de no perderme nada. ¡Gracias de nuevo! – Kiril

+0

@Lirik ver la actualización de una muestra –

+0

_ (Lo tienes, no importa el comentario de la derecha) _ - Buen trabajo, +1 –

3

Las matrices rectangulares no están diseñadas 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.

+0

escribe "Es muy sencillo escribir una función que convierta una matriz rectangular en una irregular". <--- pero quizás bastante ineficiente si se trata de una matriz grande, porque tienes que escanear toda la matriz? ¿cómo se convierte de rectangular a dentada sin reconstruirlo? – barlop

4

Versión mejorada del 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]; 
    } 
} 
+0

Exactamente lo que necesito. IEnumerable. – realPT

Cuestiones relacionadas