LINQ orderby vs IComparer

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

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

Ответы

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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