2013-01-18 54 views
4

OrderBy子句出現問題時對排序沒有任何影響。我已經在調試器中解決了這個問題,並確保這是一種情況,即代碼的分類行正在被觸發,並且在沒有應用順序之後查看結果。Linq OrderBy在If語句中不工作

public static IEnumerable<DDLOptions<TValueType>> GetDDLOptionsViewModel<TClass, TValueType>(
      IEnumerable<TClass> list, 
      Func<TClass, TValueType> value, 
      Func<TClass, string> displayText, 
      bool sort = true 
     ) 
     { 
      List<DDLOptions<TValueType>> ddlOptions; 

      ddlOptions = list.Select(
       l => new DDLOptions<TValueType> 
         { 
          Value = value(l), 
          DisplayText = displayText(l) 
         } 
        ).ToList(); <========== Works if I put the Order By here. 

      if (sort) 
      { 
       ddlOptions.OrderBy(l => l.DisplayText); <===== Does NOT work here. 
      } 

      return ddlOptions; 
     } 

回答

9

OrderBy回報會進行排序的查詢:它沒有修改原始列表(而東西像List<T>.Sort會修改原來的)

而是嘗試類似:

ddlOptions = ddlOptions.OrderBy(l => l.DisplayText).ToList(); 

編輯:你可能想玩弄的ddlOptions或類型,其中/你如何返回數據,因爲我們正在做一個額外的ToList可能比必要的,但是這可能無論如何,這是一個小問題/非問題。

+0

最簡單的方法就是將'.ToList()'移動到'return'語句。 –

+0

@MattiasBuelens可能的唯一的事情就是定義了'ddlOptions',你將不能重新分配它:'OrderBy'返回一個'IOrderedEnumerable '而不是'List '。這就是爲什麼我說乍得可能不得不調整類型或返回邏輯。 –

+0

是的,但這應該是一個簡單的解決方法。 'var'在這裏也很有用。 –

6

嘗試:

if (sort) 
{ 
    ddlOptions = ddlOptions.OrderBy(l => l.DisplayText); <===== Should work now. 
} 
+0

如果將'.ToList()'調用移動到'return'語句,以便不計算無序列表,則會更好。 –

+0

@Venson乍得將不得不重新定義'ddlOptions'到像'IEnumerable >'這個工作分配。 –

+0

好像不是這樣,如果我不完全錯誤,這個dos並不重要,因爲T仍然是一樣的,只是這個List接口被改變了,數據不應該照顧它。 – Venson

1

您需要輸入:

ddlOptions = ddlOptions.OrderBy(l => l.DisplayText); 
+0

我是個白癡......當然......我忘了把它分配給自己。謝謝Soner!我不必調用ToList就可以工作。 –

3

正如其他人所說的,你需要將OrderBy的結果賦值給某個東西,因爲它不會改變它所作用的序列。將ddlOptions設爲IEnumerable而不是List是最容易的,以便您可以將結果分配給該結果。也沒有必要在選擇ToList電話:

public static IEnumerable<DDLOptions<TValueType>> GetDDLOptionsViewModel<TClass, TValueType>(
     IEnumerable<TClass> list, 
     Func<TClass, TValueType> value, 
     Func<TClass, string> displayText, 
     bool sort = true 
    ) 
{ 
    IEnumerable<DDLOptions<TValueType>> ddlOptions; 

    ddlOptions = list.Select(
     l => new DDLOptions<TValueType> 
       { 
        Value = value(l), 
        DisplayText = displayText(l) 
       } 
      ); 

    if (sort) 
    { 
     ddlOptions = ddlOptions.OrderBy(l => l.DisplayText); 
    } 

    return ddlOptions; 
} 

請注意,此版本的方法將使用延遲執行,因此不會實際執行選擇/排序依據直到序列進行迭代。如果您不想這樣做,則可以在return行上添加ToList