Как я могу отсортировать список <T>по нескольким T.attributes? - PullRequest
27 голосов
/ 02 февраля 2011

Допустим, у меня есть список песен.

Song {
    public string Name = "";
    public int PlayOrder = 0;
    }

Теперь я хочу отсортировать их сначала по PlayOrder, начиная с нуля, а затем по алфавиту.

Таким образом, пример набора отсортированных результатов будет (Name, PlayOrder):

/*
    Pachelbel's Canon, 0
    A Happy Song, 4
    Beethoven's 5th, 4
    Some Other Song, 7
*/

Посмотрите, как PlayOrder = 4 в алфавитном порядке? Вот к чему я иду.

Сейчас у меня есть сортировка только по одному полю:

List<Song> final = new List<Song>();

...

final.Sort((x, y) => x.PlayOrder.CompareTo(y.PlayOrder));

return final;

Как я также могу сортировать по Имени, как показано выше?

Ответы [ 3 ]

51 голосов
/ 02 февраля 2011
return final.OrderBy(s => s.PlayOrder).ThenBy(s => s.Name);
26 голосов
/ 02 февраля 2011

Если вы хотите продолжить использовать метод сортировки, вам нужно сделать функцию сравнения более умной:

final.Sort((x, y) => {
    var ret = x.PlayOrder.CompareTo(y.PlayOrder);
    if (ret == 0) ret = x.Name.CompareTo(y.Name);
    return ret;
});

Если вы хотите использовать LINQ, вы можете перейти к тому, что опубликовал К. Иванов.

0 голосов
/ 11 марта 2019

Если у вас есть только один предпочтительный способ сортировки вашей песни class, вы должны реализовать IComparable и / или IComparable<Song>:

List<Song> songs = GetSongs();
songs.Sort(); // Sorts the current list with the Comparable logic

Если вы хотите сохранить список несколькими способами, IEqualityComparer<T> - это интерфейс, который вы хотели бы реализовать. Затем вы можете предоставить этот компаратор в качестве аргумента в List<T>Sort().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...