Сортировать список> на месте - PullRequest
25 голосов
/ 12 января 2011

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

Ответы [ 6 ]

47 голосов
/ 12 января 2011

Вам просто нужно предоставить IComparer<Tuple<int, int>> или Comparison<Tuple<int, int>> для метода List<T>.Sort.Последнее, вероятно, проще указать inline:

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.

12 голосов
/ 12 января 2011

Почему не это?

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

И это на месте, не так ли?

4 голосов
/ 02 ноября 2012
var listSort = from element in list orderby element.Item1  element.Item2 select element;
4 голосов
/ 12 января 2011

Вы смотрели на метод List<T>.Sort?Вы можете использовать перегрузку, которая принимает Comparison<T> делегат или IComparer<T>:

list.Sort((x,y)=> x.Item1.CompareTo(y.Item1));
1 голос
/ 02 января 2019

Теперь вы можете использовать лямбду, чтобы сделать это:

list = list.OrderByDescending(x => x.Item1).ToList();
0 голосов
/ 21 марта 2019

Мне нужно было отсортировать список IntPoints по значениям X. Я смог сделать это, изменив предыдущий пример. Я приведу свой пример здесь на тот случай, если кому-нибудь понадобится этот пример в будущем.

//Where edges is an unsorted list of edgepoints returned from the C# A.Forge Library
List<IntPoint> edges

//Sorting on the X value of the Intpoint and returning a new List
List<IntPoint> edgesSorted = (from point in edges orderby point.X select point).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...