Эквивалентная сортировка по ключевому слову LINQ orderby против метода расширения OrderBy - PullRequest
2 голосов
/ 25 мая 2011

Я пытаюсь найти набор связанных вызовов метода расширения OrderBy / ThenBy, эквивалентных оператору LINQ с использованием ключевого слова orderby.

Мой оператор LINQ с использованием ключевого слова orderby выглядит следующим образом:

List<Summary> sortedSummaries = new List<Summary>(
    from summary in unsortedSummaries
    orderby summary.FieldA ascending,
            summary.FieldB ascending,
            summary.FieldC ascending,
            summary.FieldD ascending
    select summary);

Теперь я бы предположил, что эквивалентная версия, использующая цепочечные вызовы метода расширения OrderBy / ThenBy, будет выглядеть так:

List<Summary> sortedSummaries = new List<Summary>(unsortedSummaries);    
sortedSummaries.OrderBy(x => x.FieldA).ThenBy(x => x.FieldB).ThenBy(x => x.FieldC).ThenBy(x => x.FieldD);

Однако это дает мне совсем другие результаты, чем использование моего оператора LINQ с ключевым словом orderby.

Что я могу здесь делать не так?


Причина, по которой я пытаюсь использовать цепочечные вызовы расширения OrderBy / ThenBy, заключается в том, что мне нужно использовать собственный компаратор на FieldD, например:

.ThenBy(x => x.FieldD, new NaturalSortComparer())

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

Есть идеи?

1 Ответ

5 голосов
/ 25 мая 2011

Ваш точечный нотационный вызов не назначает результат чему-либо.Должно быть:

var sortedSummaries = unsortedSummaries.OrderBy(x => x.FieldA)
                                       .ThenBy(x => x.FieldB)
                                       .ThenBy(x => x.FieldC)
                                       .ThenBy(x => x.FieldD);

Не забывайте, что операторы LINQ никогда не изменяют последовательность существующий - они возвращают последовательность new с соответствующими различиями (вэто дело, заказ).Если вы хотите выполнить сортировку на месте, используйте List<T>.Sort.

. Приведенный выше запрос в точности соответствует тому, что делает часть LINQ вашего исходного кода.Однако, если бы я хотел создать список из него, я бы не передавал его конструктору List<T> - я бы использовал метод расширения ToList:

var sortedSummaries = unsortedSummaries.OrderBy(x => x.FieldA)
                                       .ThenBy(x => x.FieldB)
                                       .ThenBy(x => x.FieldC)
                                       .ThenBy(x => x.FieldD)
                                       .ToList();

Проверьте, что это делаетВы ожидаете, что это (это действительно должно) - и затем вы можете вставить свое собственное сравнение.

...