2010-04-12 158 views
6

輸入號碼:如何排序字母數字

SHC 111U,SHB 22X ,, SHA 5555G

所需輸出:

SHB 22X,SHC 111U,SHA 5555G

我必須在停車區域只排序Vehicle no而不是pref ix和後綴字母

回答

4

沒有什麼內置的可以做到這一點,但你可以通過首先提取數字並根據它進行排序來完成。例如:

class VehicleNumberComparer : IComparer<string> 
{ 
    public int Compare(string lhs, string rhs) 
    { 
     var numExtract = new Regex("[0-9]+"); 
     int lhsNumber = int.Parse(numExtract.Match(lhs).Value); 
     int rhsNumber = int.Parse(numExtract.Match(rhs).Value); 
     return lhsNumber.CompareTo(rhsNumber); 
    } 
} 

這是未經測試(也許甚至不會編譯沒有修改),有沒有錯誤檢查,而且很可能不是世界上最快的方法,但應該給你一個想法。

+0

我們有同樣的想法!你寫的代碼,所以你得到upvote! – msarchet 2010-04-12 02:58:15

+0

感謝您的建議,我會嘗試 – drop 2010-04-12 03:08:49

+0

@Dean Harding,+ 1感謝您的意見。 – Hadas 2013-12-17 16:01:33

0

一個好辦法做到這一點是做這樣的事情

寫一個正則表達式,只是名稱的數字部分匹配,把那個配對整數值的集合中,第一個是數你從你的字符串中拉出,第二個是原始列表中數字的索引。然後對第二個列表進行排序,然後使用集合中的第二個數字對第一個列表重新排序。

+0

謝謝,我可以試試 – drop 2010-04-12 03:10:03

0

使用Sort方法接受IComparer對象並將它傳遞給您的車輛編號集合。您將需要定義一個實現IComparer的自定義類。在該類的比較方法中,您可以編寫代碼來比較兩個車輛號碼。您應該使用正則表達式來提取車號的數字部分。

+0

謝謝,您的幫助 – drop 2010-04-12 03:11:08

1

如果有可能沒有數字的板,那麼你應該檢查。

static int SortPlate(string plate) 
{ 
    int plateNumber; 
    Regex regex = new Regex(@"\d+"); 
    Int32.TryParse(regex.Match(plate).Value, out plateNumber); 

    return plateNumber; 
} 

static void Main(string[] args) 
{ 
    IEnumerable<string> data = new List<string>() {"SHC 111U", "SHB 22x", "SHA 5555G", "HOT STUFF"}; 

    var sortedList = from z in data 
        orderby SortPlate(z) 
        select z; 

    foreach (string plate in sortedList) 
    { 
     Console.WriteLine(plate); 
    } 

} 

如果這是絕對不可能的,世界的末日會來之前就有可能永遠不會沒有數字板則縮短的形式將工作:

static void Main(string[] args) 
{ 
    IEnumerable<string> data = new List<string>() {"SHC 111U", "SHB 22x", "SHA 5555G"}; 

    Regex regex = new Regex(@"\d+"); 
    var sortedList = from z in data 
        orderby Int32.Parse(regex.Match(z).Value) 
        select z; 

    foreach (string plate in sortedList) 
    { 
     Console.WriteLine(plate); 
    } 

}