c# - desc - Ordenar lista<Tuple<int, int>> in-place
order by list c# linq (4)
¿Cómo me ocuparía de ordenar en orden descendente, una List<Tuple<int, int>>
usando el primer elemento de la tupla como el valor que determina el orden? Tiene que estar en el lugar y solo sé cómo hacerlo utilizando LINQ, que devuelve una nueva lista.
¿Has mirado en el método de la List<T>.Sort
? Puede usar una sobrecarga que tome un delegado de Comparison<T>
o un IComparer<T>
:
list.Sort((x,y)=> x.Item1.CompareTo(y.Item1));
¿Por qué no esto?
List<Tuple<int, int>> list = ...
list = list.OrderBy(i => i.Item1).ToList();
Sí, crea una nueva lista, pero solo me interesa, ¿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?
Solo debe proporcionar un IComparer<Tuple<int, int>>
o Comparison<Tuple<int, int>>
a la 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 desea ordenar por el primer valor y luego el segundo, se vuelve un poco más complicado, pero aún así es factible. Por ejemplo:
list.Sort((x, y) => {
int result = y.Item1.CompareTo(x.Item1);
return result == 0 ? y.Item2.CompareTo(x.Item2) : result;
});
EDITAR: Ahora he enmendado lo anterior para ordenar en orden descendente. Tenga en cuenta que la forma correcta de hacerlo es invertir el orden de la comparación ( y
a x
lugar de x
a y
). No solo debe negar el valor de retorno de CompareTo
; esto fallará cuando CompareTo
devuelva int.MinValue
.
var listSort = from element in list orderby element.Item1 element.Item2 select element;