2017-02-22 49 views
1

我想按與常用修訂歷史記錄序列中使用的順序相關的順序排序字符串列表。有些客戶以「 - 」或「New」或其他特定代碼開頭,我可以使用LINQ定義自定義排序順序。然而,在修訂版A從修訂版Z一直修訂到修訂版Z之後,它通過Rev AZ變成Rev AA,然後通過BZ修改BA,等等。我如何使用LINQ對以下列表進行排序?使用linq自定義排序字符串排序

我有此作爲代碼的一個例子的塊:

List<string> revList = new List<string> { "A", "NC", "New", "AB", "PD", "PD1", 
              "PD2", "B", "-", "*", "BB", "NA" }; 
revList = revList.OrderByDescending(i => i.ToLower() == "pd"). 
        ThenByDescending(i => i.ToLower() == "nc"). 
        ThenByDescending(i => i.ToLower() == "na"). 
        ThenByDescending(i => i.ToLower() == "new"). 
        ThenByDescending(i => i.ToLower() == "pd1"). 
        ThenByDescending(i => i.ToLower() == "pd2"). 
        ThenByDescending(i => i.ToLower() == "-"). 
        ThenByDescending(i => i.ToLower() == "*"). 
        ThenBy(i => i).ToList(); 

foreach (string rev in revList) 
    Console.WriteLine(rev); 

這將產生輸出爲:

PD 
NC 
NA 
NEW 
PD1 
PD2 
- 
* 
A 
AB 
B 
B 

我想產生:

PD 
NC 
NA 
NEW 
PD1 
PD2 
- 
* 
A 
B 
AB 
BB 
+2

先按「長度」排序,例如在'ThenBy(i => i)之前插入'ThenBy(i => i.Length).'' –

+1

Ivan,you win。我希望自第一次以來我可以爲您的答案投票,但這是一條評論。謝謝。 – AuLion

+0

爲什麼'PD'出現在'NC'是期望的結果? –

回答

2

此代碼工作了我。

var revList = new List<string> { "A", "NC", "New", "AB", "PD", "PD1", 
             "PD2", "B", "-", "*", "BB", "NA" }; 

     revList = revList.OrderByDescending(i => i.ToLower() == "pd"). 
          ThenByDescending(i => i.ToLower() == "nc"). 
          ThenByDescending(i => i.ToLower() == "na"). 
          ThenByDescending(i => i.ToLower() == "new"). 
          ThenByDescending(i => i.ToLower() == "pd1"). 
          ThenByDescending(i => i.ToLower() == "pd2"). 
          ThenByDescending(i => i.ToLower() == "-"). 
          ThenByDescending(i => i.ToLower() == "*"). 
          ThenBy(i => i.Length).ToList(); 

     foreach (string rev in revList) 
      Console.WriteLine(rev); 
     Console.ReadLine(); 
+0

謝謝,Sameer!我不相信我沒有想到這一點。 – AuLion

0

您可以創建一個自定義對象是這樣的:

class Revision 
{ 
    public string Name { get; set; } 
    public int Rank { get; set; } 

    public Revision(string Name, int Rank) 
    { 
     this.Name = Name; 
     this.Rank = Rank; 
    } 
} 

然後,您可以創建這些對象的列表。

喜歡的東西:

List<Revision> revisions = new List<Revision>(); 
revision.Add(new Revision("PD",1)); 
revision.Add(new Revision("NC",2)); 

現在,當你可以使用LINQ,而不是試圖解析名稱排名進行排序。

最初設置對象可能很痛苦,因爲您可能需要前往ZZ,但這會讓您完全控制訂單。

p.s. - 我沒有測試這個代碼。