LINQ orderby против IComparer - PullRequest
13 голосов
/ 31 июля 2010

Хотелось бы узнать, что лучше использовать.

Класс IComparer и метод Compare для сортировки или упорядочения LINQ в списке. Оба отлично работают, но какой лучше для больших списков.

Ответы [ 3 ]

10 голосов
/ 31 июля 2010

Я бы выбрал LINQ по двум причинам.

Я ожидаю, что производительность будет примерно одинаковой для однопоточной реализации, если учесть, что лямбда-выражение в вашем предложении OrderBy компилируется в функцию - это почти все, что вы получите, реализовав IComparer в любом случае.

При этом, вы можете получить больше прироста производительности, изменив алгоритм сортировки, чтобы он соответствовал тому, как ваши данные уже отсортированы, а не изменив метод сравнения. Но я был бы готов поспорить с моим кофе сегодня утром, что OrderBy в ваших заявлениях Linq использует реализацию Quicksort, так что это, вероятно, уже довольно прилично в общем случае.

4 голосов
/ 31 июля 2010

Я предпочитаю использовать LINQ по умолчанию для всех операций на основе коллекции.Преимущество здесь в том, что мне не нужно слишком много полагаться на тип используемой коллекции (OrderBy работает на IEnumerable).

Если у вас все равно есть IList<T>, то List.Sort, вероятно, будет быстрее.

Во всяком случае, я бы не стал беспокоиться об этом, пока не будет доказана (то есть измерена) проблема производительности

2 голосов
/ 31 июля 2010

Я думаю, что семантически они очень разные, интерфейс IComparer позволяет вам определять, как ваш тип сортируется естественным образом, OrderBy дает вам возможность сортировать ваши объекты по некоторому определенному ключу, например, по заданному списку объектов Person, для запроса A sortсписок по имени, для запроса B сортируйте список по возрасту.

LINQ дает вам больше гибкости, но для OrderBy требуется Func, который принимает ваш тип объекта и возвращает ключ для использования.для сортировки, любой ключ, который вы вернете, все равно потребуется для реализации интерфейса IComparer.

С точки зрения производительности в большом списке, в зависимости от того, что вы делаете в методе сравнения, разница междуя могу представить себе два подхода, хотя лучше всего проверить это на свой тип.

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