2016-07-28 69 views
0

我想按字母順序排序填充字符串的ArrayList。當我調用Sort方法時,字母似乎排序很好,但是當涉及數字時,Sort方法似乎排錯了。使用Sort方法排序字符串時發出的問題

拿這個代碼,例如:

ArrayList list = new ArrayList(); 

list.Add ("img149"); 
list.Add ("img15"); 
list.Add ("a"); 

list.Sort(); 

for (int i = 0; i < list.Count(); i++) { 
    Console.WriteLine (list [i]); 
} 

這似乎是打印:

a 
img_149 
img_15 

字符串 「a」 進行排序罰款,但其他兩個字符串的排序不正確。我想我明白爲什麼這是「4」出現在「5」之前,但是,149實際上高於15,在這種情況下,帶有15的字符串應首先打印。

對於我的情況,我從來不知道字符串究竟是什麼(字符串代表我的程序中的文件名),而且這些名字按照字母順序排列,並按順序排列(1,2,150,300)等)。有沒有人有任何想法如何糾正這一點?

+0

Google for Natural Sort。字符串包含數字而不是數字,因此它們排序正確。 – Plutonix

+0

我使用的解決方案可以在這裏找到(http://snipd.net/alphanumericnatural-sorting-in-c-using-icomparer)。 – JasonFH2K

+0

@Plutonix感謝您提及自然排序。這就是我最終用來發現問題的原因,以及關於該主題的更多討論。這就解釋了爲什麼我之前沒有找到任何有關它的信息 - 沒有使用正確的術語。 – JasonFH2K

回答

0

它排序正確。試試這個:

List<string> sortedFileNames = list.Cast<string>().OrderBy(s => 
{ 
    string numericStr = Regex.Match(s, @"\d+").Value; 
    if (numericStr == "") 
    { 
     return s; // file name does not include number, so just sort by actual file name. 
    } 
    else 
    { 
     return s + numeric.PadLeft(10, '0'); // file name includes numbers, so sort by file name with number zero-padded to fixed length of 10. 
    } 
}).ToList(); 
+0

就像我說的,我明白這是排序正確,但這是不正確的排序。請閱讀帖子,因爲我在第二段明確指出了這一點。我還說過,我永遠不知道字符串是什麼文件名,因此我無法改變我的命名約定。 – JasonFH2K

+0

@SIRmisterD對不起,我更新了答案。 –

+0

不用擔心。 :)現在看看你發佈的代碼,我不認爲這會對我有用,因爲如果文件包含數字,我永遠不知道數字在哪裏。因此,將其固定爲10可能會導致一些問題。 – JasonFH2K