【发布时间】:2017-02-22 21:33:47
【问题描述】:
我正在尝试按照与常见修订历史序列中使用的序列相关的顺序对字符串列表进行排序。一些客户以“-”或“New”或其他一些特定代码开头,我可以使用 LINQ 定义自定义排序顺序。但是,在图纸从 Rev A 一直修改到 Rev Z 之后,它变成 Rev AA 到 Rev AZ,然后是 Rev BA 到 BZ,以此类推。如何使用 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
【问题讨论】:
-
首先按
Length排序,例如在ThenBy(i => i)之前插入ThenBy(i => i.Length). -
伊万,你赢了。我希望我能投票给你的答案,因为它是第一个,但这是一个评论。谢谢。
-
为什么
PD出现在NC之前是想要的结果? -
@JonathanWood 因为第一条规则本身!
-
@JonathanWood 仅与我们的特定编号要求相关的晦涩细节。相关的部分是我可以使用 LINQ 创建一个特定的顺序序列,但我不知道如何让后续序列以非字母顺序工作。