2011-01-26 15 views
25

Sto cercando di capire come ottenere una singola dimensione da un array multidimensionale (per il gusto dell'argomento, diciamo che è 2D), ho un array multidimensionale :Come ottenere una dimensione (slice) da un array multidimensionale

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

Se fosse una matrice irregolare, vorrei semplicemente chiamare d[0] e che mi avrebbe dato una serie di {1, 2, 3, 4, 5}, c'è un modo per ottenere lo stesso con una matrice 2D?

+1

Sembra che si desidera creare una matrice che fa riferimento a una fetta della matrice. Non penso sia possibile. – Gabe

+0

@Gabe, yah, ho esaminato la documentazione e non ho visto nulla che potesse aiutarmi a ottenere una fetta, quindi ho deciso di confermare con la community. Grazie per le informazioni! :) – Kiril

+2

Ho appena notato che la mia domanda è duplice: http://stackoverflow.com/questions/1406083/array-slice-in-c – Kiril

risposta

17

No. Ovviamente è possibile scrivere una classe wrapper che rappresenta una sezione e ha internamente un indicizzatore, ma nulla di integrato. L'altro approccio sarebbe quello di scrivere un metodo che faccia sì che copia di una sezione e restituisca un vettore - dipende se si desidera una copia o meno .

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

grazie per le informazioni ... dopo non aver trovato nulla di integrato ho pensato che io Devo scrivere un wrapper, ma volevo assicurarmi di non aver perso nulla. Grazie ancora! – Kiril

+0

@Lirik vedere l'aggiornamento per un campione –

+0

_ (Hai capito, non importa commento a destra) _ - Bel lavoro, +1 –

3

Gli array rettangolari non sono stati creati per questo scopo. Se hai bisogno di quel tipo di funzionalità, dovresti passare a un array frastagliato. È piuttosto semplice scrivere una funzione che converta una matrice rettangolare in una frastagliata.

È anche possibile ricostruire semplicemente tale array chiamando GetLength (dimensione int) nella dimensione appropriata e quindi indicizzando correttamente per recuperare ciascun valore. Sarebbe più economico rispetto alla conversione dell'intero array, ma l'opzione più economica è cambiarla per utilizzare matrici frastagliate.

+0

si scrive "È piuttosto semplice scrivere una funzione che converta una matrice rettangolare in una frastagliata." <--- ma forse abbastanza inefficiente se un array di grandi dimensioni, perché è necessario eseguire la scansione dell'intero array? come si converte rettangolare in frastagliato senza ricostruirlo? – barlop

4

Versione migliorata 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

Esattamente quello di cui ho bisogno. IEnumerable. – realPT

Problemi correlati