Подтвердить что ты не робот

Список сортировки <Tuple <int, int >> in-place

Как мне заняться сортировкой в ​​порядке убывания, a List<Tuple<int, int>> с использованием первого элемента кортежа в качестве значения, определяющего порядок? Он должен быть на месте, и я знаю только, как это сделать, используя LINQ, который возвращает новый список.

4b9b3361

Ответ 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;