输入:
SHC 111U,SHB 22x ,, SHA 5555G
需要输出:
SHB 22X,SHC 111U,SHA 5555G
我必须在停车区只排序Vehicle no
而不是前缀和后缀字母
答案 0 :(得分:5)
答案 1 :(得分: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);
}
}
这是未经测试的(可能甚至不会在没有修改的情况下编译),没有错误检查,可能不是世界上最快的方法,但应该给你一个想法。
答案 2 :(得分: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);
}
}
答案 3 :(得分:0)
这样做的好方法是做这样的事情
编写正则表达式以匹配名称的数字部分,将其放入成对整数值的集合中,第一个是从字符串中提取的数字,第二个是原始列表中数字的索引。然后对第二个列表进行排序,然后使用集合中的第二个数字重新排序第一个列表。
答案 4 :(得分:0)
使用接受IComparer对象的Sort方法,并将其传递给您的车辆编号集合。您需要定义一个实现IComparer的自定义类。在该类的比较方法中,您可以编写代码来比较两个车辆编号。您应该使用正则表达式来提取车辆编号的数字部分。