2011-11-17 22 views
7

Ho una matrice seghettata 2D. E voglio ordinarlo da qualsiasi riga.Come si ordina la matrice frastagliata per riga in C#?

ho cercato e trovato il codice per l'ordinamento per colonne

private static void Sort<T>(T[][] data, int col) 
{ 
    Comparer<T> comparer = Comparer<T>.Default; 
    Array.Sort<T[]>(data, (x,y) => comparer.Compare(x[col],y[col])); 
} 

Posso adattarlo per ordina per tutte le righe?

Qualsiasi aiuto è apprezzato.

campione della mia matrice irregolare (Aggiunto)

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication3 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      int n = 10; 
      int[][] capm = new int[3][]; 
      for (int i = 0; i <= 2; i++) 
      { 
       capm[i] = new int[n + 1]; 
      } 
      Random rand = new Random();    
      for (int i = 1; i <= n; i++) 
      { 
       capm[1][i] = i; 
      } 

      for (int i = 1; i <= n; i++) 
      { 
       capm[2][i] = rand.Next(1, 6); 
      } 

      Sort(capm, 2); 

      Console.ReadLine(); 
     } 
      private static void Sort<T>(T[][] data, int col)  
      { 
       data = data.OrderBy(i => i[col]).ToArray(); 
      } 
     } 

    } 

@Dani & @ Martin Voglio che la mia matrice irregolare per ordinare da CAPM [2] [].

+0

+1, per una domanda utile. –

risposta

4

L'unico modo che posso pensare di fare questo è l'ordinamento da una serie di indici:

private static void Sort<T>(T[][] data, int row) 
{ 
    int[] Indices = new int[data[0].Length]; 
    for(int i = 0; i < Indices.Length; i++) 
     Indices[i] = i; 

    Comparer<T> comparer = Comparer<T>.Default; 
    Array.Sort(Indices, (x, y) => comparer.Compare(data[row][x], data[row][y]); 

    for(int i = 0; i < data.Length; i++) 
    { 
     T[] OldRow = (T[])data[i].Clone(); 
     for(int j = 0; j < OldRow.Length; j++) 
      data[i][j] = OldRow[i][Indices[j]]; 
    } 
} 
+0

+ 1, per una risposta semplice. –

+0

Desidero ordinare un intero array in base a una riga selezionata. Non voglio ordinare ogni riga. – stereo

+0

@stereo: intendi ordinare le colonne di un tavolo in base a una riga? – Dani

1

Dato che si sta utilizzando una matrice irregolare questo selezionerò dal 3 ° punto .. ma una matrice 2D è probabilmente meglio se si vuole garantire che ogni riga abbia lo stesso numero di colonne ... Se si dispone di un array all'interno dell'array che non ha una terza colonna, ciò fallirà!

private static void Sort<T>(T[][] data, int col)  
{ 
    data = data.OrderBy(i => i[col]).ToArray(); 
} 

Edit:

Al fine di fare qualsiasi cosa con i nuovi dati di riferimento vi sia bisogno di tornare o passare il parametro per riferimento:

private static void Sort<T>(ref T[][] data, int col)  
{ 
    data = data.OrderBy(i => i[col]).ToArray(); 
} 

La matrice in sé non è ordinato , viene creato un nuovo array ordinato

+0

Non ha funzionato ..... – stereo

+0

Avrai bisogno di darmi più dettagli di quello che io possa aiutare .. L'ho testato e funziona bene a meno che non abbia capito bene cosa ti aspetti che il risultato sia .. –

+0

Può essere Non sono chiaro per darti un esempio. Per favore vedi di nuovo la domanda. Ho già aggiunto un campione del mio array frastagliato. – stereo

Problemi correlati