如何按字母数字混合排序数字

6

输入:

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

所需输出:

SHB 22X, SHC 111U, SHA 5555G

我需要在停车区仅对车辆编号进行排序,不包括前缀和后缀字母。

5个回答

5

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

这段代码未经测试(并且可能需要修改才能编译),没有错误检查,可能不是世界上最快的方法,但应该能给你一个想法。


@Dean Harding,+1感谢您的想法。 - Hadas

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

}

0
一个好的方法是这样做:
编写一个正则表达式,仅匹配名称中的数字部分,将其放入一对整数值的集合中,第一个值是从字符串中提取的数字,第二个值是数字在原始列表中的索引。然后按照第二个列表进行排序,最后使用集合中的第二个数字重新排序第一个列表。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接