2011-11-17 55 views
7

Tengo una matriz dentada 2D. Y quiero ordenarlo por cualquier fila.¿Cómo puedo ordenar la matriz dentada por fila en C#?

He buscado y encontrado código de clasificación por columnas

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])); 
} 

puedo adaptar para ordenar por ninguna fila?

Cualquier ayuda es apreciada.

muestra de mi matriz escalonada (Agregado)

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 Quiero que mi matriz escalonada para ordenar por CAPM [2] [].

+0

+1, para una pregunta útil. –

Respuesta

4

La única manera que puedo pensar de hacer esto es la clasificación por una serie de índices:

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, para una respuesta simple. –

+0

Quiero ordenar una matriz completa por una fila que solo se seleccionó. No quiero clasificar cada fila. – stereo

+0

@stereo: ¿Quiere decir que ordena las columnas de una tabla basada en una fila? – Dani

1

Teniendo en cuenta que está utilizando una matriz escalonada Esto ordenará por la tercera tema .. pero es una matriz 2D probablemente sea mejor si quiere garantizar que cada fila tenga el mismo número de columnas ... Si tiene una matriz dentro de la matriz que no tiene una tercera columna, ¡esto fallará!

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

Editar:

Con el fin de hacer cualquier cosa con los nuevos datos de referencia que sea necesario para devolverlo o pasar el parámetro por referencia:

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

La matriz en sí no está ordenada , se crea una nueva matriz ordenada

+0

No funcionó ..... – stereo

+0

Necesitarás darme más detalles que eso para que lo ayude ... Lo probé y funciona bien a menos que no haya entendido lo que esperas que sea el resultado. –

+0

Puede ser No estoy claro para darte un ejemplo. Por favor vea la pregunta de nuevo. Ya agregué una muestra de mi matriz dentada. – stereo

Cuestiones relacionadas