2011-01-12 17 views
17

¿Qué debo hacer para ordenar en orden descendente, un List<Tuple<int, int>> utilizando el primer elemento de la tupla como el valor que determina el pedido? Tiene que estar en el lugar y solo sé cómo hacerlo usando LINQ que devuelve una nueva lista.Lista de clasificación <Tuple <int, int>> in situ

Respuesta

37

Sólo tiene que proporcionar una IComparer<Tuple<int, int>> o una Comparison<Tuple<int, int>> al método List<T>.Sort. Este último es probablemente más fácil de especificar en línea:

list.Sort((x, y) => y.Item1.CompareTo(x.Item1)); 

Si usted quiere pedir por el primer valor y luego el segundo valor, se vuelve un poco más complicado, pero todavía factible. Por ejemplo:

list.Sort((x, y) => { 
    int result = y.Item1.CompareTo(x.Item1)); 
    return result == 0 ? y.Item2.CompareTo(x.Item2) : result; 
}); 

EDITAR: He modificado lo anterior para ordenarlo en orden descendente. Tenga en cuenta que la forma correcta de hacerlo es invertir el orden de la comparación (y a x en lugar de xay). Debe no solo negar el valor de retorno de CompareTo - esto fallará cuando CompareTo devuelva int.MinValue.

+2

¿No es esa clasificación en orden ascendente? – BobTurbo

+0

@BobTurbo: Bien manchado. Arreglará. –

+0

De acuerdo con las tuplas de fuentes de referencia, el comparador predeterminado se puede comparar por Item1 y luego Item2. http://referencesource.microsoft.com/#mscorlib/system/tuple.cs, 189 – ShitalShah

6

¿Por qué no esto?

List<Tuple<int, int>> list = ... 
list = list.OrderBy(i => i.Item1).ToList(); 

Sí, crea una nueva lista, pero estoy interesado, ¿por qué no te gusta esto?


List<Tuple<int, int>> list = new List<Tuple<int, int>> 
{ 
    new Tuple<int,int>(1,1), 
    new Tuple<int,int>(0,2), 
    new Tuple<int,int>(3,0) 
}; 

list.Sort(Comparer<Tuple<int, int>>.Default); 

produce:

0,2 
1,1 
3,0 

y está en el lugar, ¿no es así?

+0

¿Quizás porque no es un tipo de lugar? –

+0

@Martinho: Sí, no lo es. Edité mi publicación para aclarar mis preguntas. – abatishchev

+0

¿'Tuple ' ** documentado ** se ordena por 'Item1' y luego' Item2'? –

2
var listSort = from element in list orderby element.Item1 element.Item2 select element; 
Cuestiones relacionadas