如何排序字母数字
问题描述:
输入号码:如何排序字母数字
SHC 111U,SHB 22X ,, SHA 5555G
所需输出:
SHB 22X,SHC 111U,SHA 5555G
我必须在停车区域只排序Vehicle no
而不是pref ix和后缀字母
答
没有什么内置的可以做到这一点,但你可以通过首先提取数字并根据它进行排序来完成。例如:
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
谢谢,我可以试试 – drop 2010-04-12 03:10:03
答
如果有可能没有数字的板,那么你应该检查。
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);
}
}
感谢您的参考文章 – drop 2010-04-12 03:40:18