使用带有自定义排序的linq对字符串列表进行排序

时间:2017-02-22 21:33:47

标签: c# linq sorting

我正在尝试按照与常见修订历史序列中使用的序列相关的顺序对字符串列表进行排序。有些客户以" - "或" New"或其他一些特定代码开头,我可以使用LINQ来定义自定义排序顺序。但是,在从Rev A一直修改绘图到Rev Z之后,它通过Rev AZ变为Rev AA,然后通过BZ变为Rev BA,等等。如何使用LINQ对以下列表进行排序?

我将此作为示例代码块:

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

这会产生输出:

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

我想制作:

"Send"

2 个答案:

答案 0 :(得分:3)

这段代码对我有用。

 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();

答案 1 :(得分: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。 - 我没有测试这段代码。