Есть ли решение для этого типа сортировки в массиве? - PullRequest
0 голосов
/ 28 января 2019

У меня есть строковый массив, содержащий имя файла, такое как

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

Объяснение: SC00 и SC01 - это семейство /Имя группы.И в этом SPL является родителем, а ODP является дочерним.

Я очень запутался, как сортировать этот тип массива.Может ли какое-нибудь тело помочь мне?

1 Ответ

0 голосов
/ 28 января 2019

Возможно, не самый эффективный или надежный способ, но этот

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...