如何排序字母数字

问题描述:

输入号码:如何排序字母数字

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

所需输出:

SHB 22X,SHC 111U,SHA 5555G

我必须在停车区域只排序Vehicle no而不是pref ix和后缀字母

好极了,精心优化的开源解决方案在http://dotnetperls.com/alphanumeric-sorting

+0

感谢您的参考文章 – drop 2010-04-12 03:40:18

没有什么内置的可以做到这一点,但你可以通过首先提取数字并根据它进行排序来完成。例如:

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

谢谢,我可以试试 – drop 2010-04-12 03:10:03

使用Sort方法接受IComparer对象并将它传递给您的车辆编号集合。您将需要定义一个实现IComparer的自定义类。在该类的比较方法中,您可以编写代码来比较两个车辆号码。您应该使用正则表达式来提取车号的数字部分。

+0

谢谢,您的帮助 – drop 2010-04-12 03:11:08

如果有可能没有数字的板,那么你应该检查。

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); 
    } 

}