ToList (). Sort () в запросе Linq выдает ошибку компиляции - PullRequest
0 голосов
/ 12 мая 2010

Я пытаюсь объединить два SortedDictionaries, изменить результат на List<KeyvaluePair<string,string>> и Sort() результат. Следующее утверждение выдает ошибку:

var combinedEntries = from p in leftDict.Union(rightDict).ToList().Sort(myComparer) select p;

Ошибка: не удалось найти реализацию шаблона запроса для типа источника 'void'. «Выбрать» не найдено.

Это не работает, потому что Sort () возвращает void. Если я разделю заявление, оно будет работать:

var combinedEntries = from p in leftDict.Union(rightDict) select p;
List<KeyValuePair<string, string>> finalentries = combinedEntries.ToList();
finalentries.Sort(comparer);

Я понимаю, что sort это метод типа List, а не IEnumerable, но я подумал, что вызов ToList() до Sort() решит эту проблему. Итак, первый вопрос: можно ли это использовать, как я пытаюсь в первом утверждении? Если нет, то как мне использовать orderby здесь?

Ответы [ 4 ]

5 голосов
/ 12 мая 2010

.Sort () не возвращает значение. Сортирует список по месту.

Возможно, вы захотите попробовать использовать .OrderBy перед .ToList () или вам нужно завершить строку в .ToList (), чтобы список можно было присвоить вашей переменной. Тогда сортируй.

var sortedCombined = (from p in leftDict.Union(rightDict)
                      orderby p.Key // or whatever you need
                      select p).ToList();
2 голосов
/ 12 мая 2010

Вы можете сделать combinedEntries = <query goes here>.OrderBy(a => a, myComparer).ToList();.
Однако отдельное преобразование его в список и явная сортировка намного удобнее для чтения, и я готов поспорить на хорошие деньги, что List.Sort легко превосходит OrderBy по производительности.

1 голос
/ 12 мая 2010

Как это:

var combinedEntries = leftDict.Union(rightDict).OrderBy(kvp => kvp.Key).ToList();
1 голос
/ 12 мая 2010

Сортировка не возвращает значение, и комбинированный ввод собирает результат последнего вызванного метода. Поскольку Sort возвращает void, вы получаете ошибку, пытаясь присвоить void переменной. Из-за этого вы должны держать сортировку «отделенной» от остальных.

...