2009-11-11 3 views
1
var sortQ = filterQ; // <--- update 

if (iSortingCols > 0) 
{ 
    sortQ = (sortDirs[0] == "asc") ? 
     sortQ.OrderBy((d) => d.GetColumnData()[sortCols[0]]) : 
     sortQ.OrderByDescending((d) => d.GetColumnData()[sortCols[0]]); 

    if (iSortingCols > 1) 
    { 
     for (int i = 1; i < iSortingCols; i++) 
     { 
      sortQ = (sortDirs[i] == "asc") ? 
       sortQ.ThenBy(d => d.GetColumnData()[sortCols[i]]) : 
       sortQ.ThenByDescending(d => d.GetColumnData()[sortCols[i]]); 

     } 
    } 
} 

Компилятор подчеркивает два результата тройного оператора внутри для цикла, говоря, что IEnumerable < ...> не имеет перегрузки метода под названием ThenBy (и аналогично для ThenByDescending), но sortQ будет IOrderedEnumerable < ...> в этом блоке. Почему выбор типа C# не подходит?Тип вывода с операторами управления

Update: для тех, кто мог бы спутать до того, что я оставил из оригинального фрагмента кода, что я назначая sortQ в результате другого запроса, который заставил тип логического вывода к типу sortQ как IEnumerable < ..>, что, конечно же, то, что прикручивало мой пример. Ниже приведен ответ. Благодаря @Marc для чтения между строками.

ответ

2

Я предполагаю, sortQ является IEnumerable<T>; вам нужен IOrderedEnumerable<T> для использования ThenBy; к счастью, ваш первый OrderBy возвращает это, поэтому просто поймайте это:

var result = (sortDirs[0] == "asc") ? 
    sortQ.OrderBy((d) => d.GetColumnData()[sortCols[0]]) : 
    sortQ.OrderByDescending((d) => d.GetColumnData()[sortCols[0]]); 

if (iSortingCols > 1) 
{ 
    for (int i = 1; i < iSortingCols; i++) 
    { 
     result = (sortDirs[i] == "asc") ? 
      result.ThenBy(d => d.GetColumnData()[sortCols[i]]) : 
      result.ThenByDescending(d => d.GetColumnData()[sortCols[i]]); 

    } 
} 
+0

Doh! Ты прав. Я даже не думал о предыдущем назначении sortQ. Хороший звонок. –

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