入力:
SHC 111U、SHB 22x、SHA 5555G
必要な出力:
SHB 22X、SHC 111U、SHA 5555G
Vehicle no
接頭辞と接尾辞ではなく、駐車場でのみソートする必要があります
入力:
SHC 111U、SHB 22x、SHA 5555G
必要な出力:
SHB 22X、SHC 111U、SHA 5555G
Vehicle no
接頭辞と接尾辞ではなく、駐車場でのみソートする必要があります
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);
}
}
これはテストされておらず (おそらく変更なしではコンパイルすらできないでしょう)、エラー チェックも行われておらず、おそらく世界最速の方法ではありませんが、アイデアは得られるはずです。
番号のないプレートがある可能性がある場合は、それを確認する必要があります。
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);
}
}
これを行う良い方法は、このようなことをすることです
名前の数値部分だけに一致する正規表現を記述し、ペアの整数値のコレクションに入れます。最初の値は文字列から取得した数値で、2 番目の値は元のリストの数値のインデックスです。次に、2 番目のリストを並べ替え、コレクション内の 2 番目の番号を使用して最初のリストを並べ替えます。
IComparerオブジェクトを受け入れる Sort メソッドを使用して、車両番号のコレクションを渡します。IComparer を実装するカスタム クラスを定義する必要があります。そのクラスの Compare メソッドで、2 つの車両番号を比較するコードを記述できます。車両番号の数値部分を抽出するには、おそらく正規表現を使用する必要があります。