Как мне заняться сортировкой в порядке убывания, a List<Tuple<int, int>>
с использованием первого элемента кортежа в качестве значения, определяющего порядок? Он должен быть на месте, и я знаю только, как это сделать, используя LINQ, который возвращает новый список.
Список сортировки <Tuple <int, int >> in-place
Ответ 1
Вам просто нужно предоставить IComparer<Tuple<int, int>>
или Comparison<Tuple<int, int>>
для метода List<T>.Sort
. Последнее, вероятно, проще указать в строке:
list.Sort((x, y) => y.Item1.CompareTo(x.Item1));
Если вы хотите заказать по первому значению, а затем второе значение, оно становится немного сложнее, но все же возможно. Например:
list.Sort((x, y) => {
int result = y.Item1.CompareTo(x.Item1));
return result == 0 ? y.Item2.CompareTo(x.Item2) : result;
});
РЕДАКТИРОВАТЬ: Я изменил приведенный выше порядок сортировки в порядке убывания. Обратите внимание, что правильный способ сделать это - изменить порядок сравнения (y на x вместо x на y). Вы не должны просто отрицать возвращаемое значение CompareTo
- это произойдет, если CompareTo
возвращает int.MinValue
.
Ответ 2
Почему не это?
List<Tuple<int, int>> list = ...
list = list.OrderBy(i => i.Item1).ToList();
Да, он создает новый список, но мне просто интересно - почему вам это не нравится?
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);
дает:
0,2
1,1
3,0
И это на месте, не так ли?
Ответ 3
Вы просмотрели метод List<T>.Sort
? Вы можете использовать перегрузку, которая принимает делегат Comparison<T>
или IComparer<T>
:
list.Sort((x,y)=> x.Item1.CompareTo(y.Item1));
Ответ 4
var listSort = from element in list orderby element.Item1 element.Item2 select element;