Добавить OrderByDescending в оператор Linq - PullRequest
0 голосов
/ 03 ноября 2010

У меня есть следующий код для извлечения ключевых слов из строки:

var results = text.Split(new char[]{' ',',','.','!','?','_',':',';','/','(',')','\n','\r','-','*','"','/','\\','$','%','+','-','='})               // default split by whitespace
    .GroupBy(str => str)  // group words by the value
    .Select(g => new
                 {
                     str = g.Key,      // the value
                     count = g.Count() // the count of that value
                 });

Теперь мне нужно добавить OrderByDescending к нему, но я не уверен, где его разместить..GroupBy(str => str).OrderByDescending(count => count) дал неверные результаты.Как правильно это сделать?

Ответы [ 3 ]

4 голосов
/ 03 ноября 2010

Вы можете добавить его после выбора.

.Select(...whatever...).OrderByDescending(item => item.count);
2 голосов
/ 03 ноября 2010

Вы ошибаетесь из-за того, что вы даете переменной в лямбде то же имя, что и свойство анонимного типа.OrderByDescending(count => count) сортирует по всему объекту.Вам нужно отсортировать свойство count, поэтому вы должны использовать OrderByDescending(x => x.count).

2 голосов
/ 03 ноября 2010

Используйте его после GroupBy и вызывайте g.Count() так же, как вы делали это в своем Select выражении:

.GroupBy(str => str)
.OrderByDescending(g => g.Count())
.Select(g => new ...) // rest of your code here

РЕДАКТИРОВАТЬ: Я на самом деле предпочитаю ответ Энтони своему собственному и собирался изменить мой, но к тому времени он опубликовал свой ответ. Это очень незначительная проблема и преждевременная оптимизация, но мой опубликованный подход будет несколько медленнее при работе с большими коллекциями, поскольку Count() выполняется дважды, тогда как подход Энтони сортирует по уже вычисленным Count(), сделанным в Select заявление. Просто нужно помнить о том, что нужно создавать чистые запросы LINQ.

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

var query = from g in text.Split(...).GroupBy(str => str)
            let count = g.Count()
            orderby count descending
            select new { str = g.Key, Count = count };
...