2011-05-25 122 views
2

我試圖想出一套鏈接OrderBy/ThenBy擴展方法調用,它等效於使用orderby關鍵字的LINQ語句。LINQ orderby關鍵字與OrderBy擴展方法的等效排序

使用orderby關鍵字我的LINQ語句如下所示:

List<Summary> sortedSummaries = new List<Summary>(
    from summary in unsortedSummaries 
    orderby summary.FieldA ascending, 
      summary.FieldB ascending, 
      summary.FieldC ascending, 
      summary.FieldD ascending 
    select summary); 

現在,我猜想,等價版本,採用鏈式OrderBy/ThenBy擴展方法的調用是這樣的:

List<Summary> sortedSummaries = new List<Summary>(unsortedSummaries);  
sortedSummaries.OrderBy(x => x.FieldA).ThenBy(x => x.FieldB).ThenBy(x => x.FieldC).ThenBy(x => x.FieldD); 

但是,這使我得到了與使用關鍵字orderby的LINQ語句完全不同的結果。

我在這裏可能會做錯什麼?


我想轉換爲使用鏈接的原因OrderBy/ThenBy擴展方法調用的是,我需要使用自定義比較上FieldD,就像這樣:

.ThenBy(x => x.FieldD, new NaturalSortComparer()) 

我不能圖中如何使用LINQ語句與orderby關鍵字,所以我認爲使用擴展方法可能會讓我更遠,但由於我無法讓我的擴展方法版本給我與我的orderby關鍵字版本相同的結果,我現在回到製圖板。

任何想法?

回答

5

您的點符號調用不會將結果分配給任何東西。它應該是:

var sortedSummaries = unsortedSummaries.OrderBy(x => x.FieldA) 
             .ThenBy(x => x.FieldB) 
             .ThenBy(x => x.FieldC) 
             .ThenBy(x => x.FieldD); 

不要忘了LINQ運營商永遠不變的現有序列 - 他們返回一個序列與適當的差異(在這種情況下,排序)。如果您想在原地排序,請使用List<T>.Sort

上面的查詢正是您原始代碼的LINQ部分所做的。但是,如果我想從它構建一個清單,我不會把它傳遞給List<T>構造 - 我會用ToList擴展方法:

var sortedSummaries = unsortedSummaries.OrderBy(x => x.FieldA) 
             .ThenBy(x => x.FieldB) 
             .ThenBy(x => x.FieldC) 
             .ThenBy(x => x.FieldD) 
             .ToList(); 

檢查已經做了你指望它(它是什麼真的應該) - 然後你可以把你的自定義比較。

+0

啊,是的,就是這樣。現在完美。我以爲我是LINQ運營商的會計師,從不改變現有的序列,但我必須混合起來:) – 2011-05-25 16:20:40