輸入號碼:如何排序字母數字
SHC 111U,SHB 22X ,, SHA 5555G
所需輸出:
SHB 22X,SHC 111U,SHA 5555G
我必須在停車區域只排序Vehicle no
而不是pref ix和後綴字母
輸入號碼:如何排序字母數字
SHC 111U,SHB 22X ,, SHA 5555G
所需輸出:
SHB 22X,SHC 111U,SHA 5555G
我必須在停車區域只排序Vehicle no
而不是pref ix和後綴字母
好極了,精心優化的開源解決方案在http://dotnetperls.com/alphanumeric-sorting
沒有什麼內置的可以做到這一點,但你可以通過首先提取數字並根據它進行排序來完成。例如:
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);
}
}
這是未經測試(也許甚至不會編譯沒有修改),有沒有錯誤檢查,而且很可能不是世界上最快的方法,但應該給你一個想法。
一個好辦法做到這一點是做這樣的事情
寫一個正則表達式,只是名稱的數字部分匹配,把那個配對整數值的集合中,第一個是數你從你的字符串中拉出,第二個是原始列表中數字的索引。然後對第二個列表進行排序,然後使用集合中的第二個數字對第一個列表重新排序。
謝謝,我可以試試 – 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