c#
  • .net
  • linq
  • sql-order-by
  • 2010-11-03 3 views 0 likes 
    0

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

    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) дали неверные результаты. Как все исправить?

    ответ

    4

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

    .Select(...whatever...).OrderByDescending(item => item.count); 
    
    +1

    +1 для повышения производительности. См. [Мой ответ] (http://stackoverflow.com/questions/4088064/add-orderbydescending-to-linq-statement/4088088#4088088) для объяснения. –

    2

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

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

    EDIT: Я предпочитаю Anthony's answer к моей и собирался изменить мое, но к тому времени он отправил его ответ. Это очень незначительная проблема и является преждевременной оптимизацией, но мой опубликованный подход будет немного медленнее при работе с большими коллекциями, поскольку 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 }; 
    
    2

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

    Смежные вопросы