6

输入:

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

需要的输出:

SHB 22X、SHC 111U、SHA 5555G

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

4

5 回答 5

5

http://dotnetperls.com/alphanumeric-sorting上的出色、优化的开源解决方案

于 2010-04-12T03:24:43.810 回答
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);
    }
}

这是未经测试的(甚至可能不经过修改就无法编译),没有错误检查,并且可能不是世界上最快的方法,但应该给你一个想法。

于 2010-04-12T02:55:38.103 回答
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);
    }

}
于 2010-04-12T03:19:09.120 回答
0

做到这一点的一个好方法是做这样的事情

编写一个正则表达式以仅匹配名称的数字部分,将其放入成对整数值的集合中,第一个是您从字符串中提取的数字,第二个是原始列表中数字的索引。然后对第二个列表进行排序,然后使用集合中的第二个数字对第一个列表重新排序。

于 2010-04-12T02:57:38.023 回答
0

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

于 2010-04-12T03:02:21.863 回答