2010-05-26 34 views
9

Tenía una lista de tuplas donde cada tupla consta de dos enteros y quería ordenar por el segundo entero. Después de buscar en la ayuda de Python obtuve esto:Cómo ordenar una lista por el segundo elemento de tupla en python y C#

sorted(myList, key=lambda x: x[1]) 

que es genial. Mi pregunta es, ¿hay una manera igualmente breve de hacer esto en C# (el idioma en el que tengo que trabajar)? Sé la respuesta obvia que implica la creación de clases y la especificación de un delegado anónimo para todo el paso de comparación, pero tal vez también hay una forma orientada a linq. Gracias de antemano por cualquier sugerencia.

Respuesta

6

Suponiendo que la lista de tuplas tiene un tipo IEnumerable<Tuple<int, int>> (una secuencia de tuplas representado usando Tuple<..> clase de .NET 4.0), se puede escribir utilizando los siguientes métodos de extensión de LINQ:

var result = myList.OrderBy(k => k.Item2); 

En el código k.Item2 devuelve el segundo componente de la tupla: en C#, esta es una propiedad (porque acceder al elemento por índice no sería seguro en general). De lo contrario, creo que el código es bastante breve (también gracias a la buena notación de función lambda).

Utilizando la sintaxis de la consulta LINQ, se podría escribir como este (aunque la primera versión es mi humilde opinión más legible y sin duda más sucinta):

var result = from k in myList orderby k.Item2 select k; 
+0

genial gracias Estoy deseando actualizar a 4.0 pronto –

+0

@Damian: Esto funcionaría en C# 3.0 también, pero tendría que implementar su propia 'Tuple ' (es simplemente una clase simple con dos propiedades de tipos genéricos 'T1 Item1 {get; set;}' y 'T 2 Artículo2 {obtener; conjunto; } ' –

14

Otra manera de hacerlo en Python es este

from operator import itemgetter 
sorted(myList, key=itemgetter(1)) 
+0

aplausos No sabía sobre itemgetter –

Cuestiones relacionadas