сравнивая два объекта по двум свойствам - PullRequest
2 голосов
/ 12 октября 2010

Как отсортировать два объекта в списке, используя два свойства: по возрастанию, а по убыванию. когда используется linq, он говорит, что мне нужно реализовать интерфейс IComparer, но не уверен, как сравнивать два объекта, используя два свойства одновременно.

Скажи класс человека по имени по возрастанию и по возрастанию по убыванию.

Ответы [ 3 ]

12 голосов
/ 12 октября 2010

Ну, вам нужно решить, какое из ваших основных сравнений. Используйте вторичное сравнение только в том случае, если первое дает равенство. Например:

public int Compare(Person p1, Person p2)
{
    int primary = p1.Name.CompareTo(p2.Name);
    if (primary != 0)
    {
        return primary;
    }
    // Note reverse order of comparison to get descending
    return p2.Age.CompareTo(p1.Age);
}

(Это можно записать более компактно различными способами, но я сохранил это очень четко, чтобы вы могли понять концепции.)

Обратите внимание, что в MiscUtil у меня есть несколько строительных блоков, чтобы вы могли легко создавать компараторы, используя лямбда-выражения, составлять компараторы и т. Д.

5 голосов
/ 12 октября 2010

Если вы хотите создать новую копию списка (чтобы у вас все еще был оригинальный порядок в исходном списке), вы можете сделать это:

List<Person> unsortedList;

sortedList = unsortedList.OrderBy(p => p.Name).ThenByDescending(p => p.Age);
0 голосов
/ 12 октября 2010
...