Возможно, не самый эффективный или надежный способ, но этот
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);