数组中这种类型的排序有什么解决方案吗?

时间:2019-01-28 09:39:10

标签: c# arrays sorting

我有一个字符串数组,其中包含文件名,例如

ODP001(SC00).csv, OPD003(SC00).csv, ODP002(SC00).csv, SPL001(SC00).csv, SPL002(SC01).csv, ODP003(SC01).csv, ODP01(SC01).csv, ODP(SC02).csv 

应按以下顺序排序:

SPL001(SC00).csv  
ODP001(SC00).csv
ODP002(SC00).csv
ODP003(SC00).csv

SPL002(SC01).csv
ODP001(SC01).csv
ODP002(SC01).csv
ODP003(SC01).csv

说明:SC00SC01是家庭/组的名称。并且SPL是父母,ODP是孩子。

我很困惑如何对这种类型的数组进行排序。有人可以帮我吗?

1 个答案:

答案 0 :(得分:2)

也许不是最有效或最可靠的方法,但这

static void Main()
{
    string[] strArr = new string[]
    {
        "ODP001(SC00).csv", 
        "ODP003(SC00).csv", 
        "ODP002(SC00).csv",
        "SPL001(SC00).csv",
        "SPL002(SC01).csv",
        "ODP003(SC01).csv",
        "ODP001(SC01).csv",
        "ODP(SC02).csv"
    };

    var sorted = strArr
        .OrderBy(s => s.Substring(s.IndexOf("(")))
        .ThenByDescending(s => s.Substring(0,3))
        .ThenBy(s => s.Substring(3));

    Console.WriteLine(string.Join("\n", sorted));
}

将显示:

SPL001(SC00).csv
ODP001(SC00).csv
ODP002(SC00).csv
ODP003(SC00).csv
SPL002(SC01).csv
ODP001(SC01).csv
ODP003(SC01).csv
ODP(SC02).csv

您当然可以创建一个字符串比较器,或者一个看起来像这样的类:

public class MyClass
{
    public MyClass(string filename)
    {
        // initialize the fields according to the filename (for example:)
        int typeLength = 3;
        int indexOpen = filename.IndexOf("(");
        int indexClose = filename.IndexOf(")");

        Type = filename.Substring(0,typeLength);
        int.TryParse(filename.Substring(typeLength,indexOpen-typeLength),out Order);
        int.TryParse(filename.Substring(indexOpen+3, indexClose-indexOpen-2),out SCOrder);
    }

    public string Type {get;set;}
    public int Order {get;set;}
    public int SCOrder {get;set;}
}

然后:

strArr.Select(s => new MyClass(s))
      .OrderBy(o => o.SCOrder)
      .ThenByDescending(o => o.Type)
      .ThenBy(o => o.Order);