2017-02-22 50 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. - 我没有测试这个代码。