2015-04-08 3 views
0

J'ai une liste 2D de chaînes (liste de listes de chaînes). Je veux trier en fonction d'une colonne particulière.Tri de la liste 2D des chaînes

List<List<String>> matrix = new List<List<String>>(); 
matrix.Add(new List<String>()); 
matrix[0].Add("A"); 
matrix[0].Add("1"); 
matrix[0].Add("2");  

matrix.Add(new List<String>()); 
matrix[1].Add("B"); 
matrix[1].Add("0"); 
matrix[1].Add("1");   

matrix.Add(new List<String>()); 
matrix[2].Add("C"); 
matrix[2].Add("0"); 
matrix[2].Add("2"); 

matrix.Add(new List<String>()); 
matrix[3].Add("D"); 
matrix[3].Add("1"); 
matrix[3].Add("1"); 

Quand elle est triée en fonction de la colonne 2, il devrait ressembler à ceci:

Column 1  Column 2  Column 3 
--------  --------  -------- 
B    0    1 
C    0    2 
A    1    2 
D    1    1 

Quand elle est triée en fonction de la colonne 3, il devrait ressembler à ceci:

Column 1  Column 2  Column 3 
--------  --------  -------- 
B    0    1 
D    1    1 
A    1    2 
C    0    2 

Tri d'une colonne secondaire est appréciée mais pas nécessaire (lorsque la colonne 2 est la colonne primaire 3 est secondaire et vice versa). Dans mes exemples, les colonnes secondaires ne sont pas triées.

+1

sont les numéros d'index que vous utilisez avec la matrice correcte? – Shekhar

+0

@Shekhar: Je suppose que non. Cela semble une faute de frappe ... Fixe. –

+0

Il n'y a pas beaucoup de détails à faire, mais il semble que le deuxième niveau de la liste serait mieux mis en œuvre en tant que classe ou Tuple –

Répondre

2

Vous pouvez utiliser OrderBy:

var orderedResult = matrix.OrderBy(x => x[1]) 

1 est l'indice du second élément dans la liste. Je suggère cependant de ne pas créer une liste de listes, mais un tableau 2D, ou un tableau 1D avec un type approprié.

Ceci est très dangereux, en particulier lorsque vous avez des listes de tailles différentes. Vous pouvez « améliorer » cela en utilisant un contrôle de longueur:

var orderedResult = matrix.OrderBy(x => x.Count > 1 ? x[1] : null) 

Si vous voulez que le résultat en tant que List, utilisez ToList():

var orderedResult = matrix.OrderBy(x => x.Count > 1 ? x[1] : null).ToList() 
+0

Je ne sais pas pourquoi, mais cela n'a pas fonctionné. Si j'utilise 2D array alors comment puis-je écrire le code? –

+0

Quel est le résultat? –

+0

J'ai utilisé deux colonnes. Un pour le nom et l'autre pour la valeur. Ils ont juste changé de position. Je veux dire que la valeur est devenue la première colonne et le nom est devenu deuxième. –