2014-10-27 60 views
0

友綜合排序,我有一個這樣的名單:在列表<string> C#

var filenames = new List<string> 
{ 
    "150_A_1_A", 
    "150_A_1", 
    "149_2", 
    "149_1", 
    "150_1_A", 
    "150_A_2", 
    "150_2_A" 
}; 

,我需要這些名單在這樣的方式得到以下順序進行排序:

149_1 
149_2 
150_1_A 
150_2_A 
150_A_1 
150_A_1_A 

任何理念?感謝

+0

使用'的.sort()'方法這裏已經回答的問題[鏈接](http://stackoverflow.com/questions/5573047/sort-list-in- c-sharp) – 2014-10-27 13:08:32

+1

其中'150_A_2'項目將按此順序排列? – 2014-10-27 13:09:57

+3

或物品'150_10_A'? (我猜你的例子並不是問題的全部代表)。 – SWeko 2014-10-27 13:11:08

回答

1

赫斯是一個LINQ表達式做你需要的東西:

var x = filenames.Select(s => new { value = s, splitted = s.Split('_') }).OrderBy(s => int.Parse(s.splitted[0])); 

for (int i = 1; i < x.Max(s => s.splitted.Length); i++) 
{ 
    var thisI = i; 
    x = x.ThenBy(s => thisI >= s.splitted.Length ? null : s.splitted[thisI]); 
} 

var sorted = x.Select(s => s.value); 

首先我用'_'分割字符串

然後我用數字排序第一個字段。

最後我排序的所有remaing領域的字母順序

0

filenames.Sort();不正是你要找的

如果你想偷懶的執行,你可以這樣做: filenames.OrderBy(s => s);

+4

@ChrisEelmaa解釋他爲什麼不在尋找什麼?輸出與他的示例輸出完全匹配 – Rob 2014-10-27 13:10:27

+0

我在downvoted之前嘗試了filenames.Sort()。它給了我「150_A_2」作爲最後一項,但那不是OP正在尋找什麼? – 2014-10-27 13:12:57

+4

@ChrisEelmaa人們會認爲這是他輸出中的一個缺點,除非我們相信有一個名爲'.SortExceptWhereElementEquals150_A_2()' – Rob 2014-10-27 13:13:47