Etwas verständlicher sieht das Ganze wahrscheinlich in der Form aus:
1 | List<string> ports = new List<string>() {
|
2 | "COM1",
|
3 | "COM18",
|
4 | "COM2",
|
5 | "COM19",
|
6 | "COM20",
|
7 | "COM4",
|
8 | "COM5"};
|
9 |
|
10 | ports.Sort(new Comparison<string>( ComparePortStrings ));
|
11 |
|
12 | ...
|
13 |
|
14 |
|
15 |
|
16 | //returns:
|
17 | // a < b --> return < 0
|
18 | // a == b --> return = 0
|
19 | // a > b --> return > 0
|
20 | private int ComparePortStrings (string a, string b) {
|
21 | return int.Parse(a.Substring(3)) -
|
22 | int.Parse(b.Substring(3));
|
23 | }
|
Man kann der Sort-Methode eine Methode die zum Vergleichen verwendet
wird mitgeben (ähnlich einem Prädikat/Funktor in der STL in C++)
Ist vom Prinzip genau das Gleiche wie die erste Variante, nur dass in
der vorherigen Variante eine anonyme Methode verwendet wurde.
Das Parse macht nur aus dem String (hier ab Index 3) einen Integer.
Durch die Subtraktion erhält man gleich das passende Ergebnis für die
Compare-Methode.
Hier noch eine etwas allgemeinere Variante der Compare-Methode:
1 |
|
2 | Regex rexNum =new Regex(@"(?<Text>^.+?)(?<Num>\d+)?(?<Ext>\.[^\.]+)?$", RegexOptions.Compiled);
|
3 | Match mA = rexNum.Match(a);
|
4 | Match mB = rexNum.Match(b);
|
5 |
|
6 | if(mA.Success && mB.Success &&
|
7 | mA.Groups["Num"].Success && mB.Groups["Num"].Success &&
|
8 | mA.Groups["Text"].Value == mB.Groups["Text"].Value]) {
|
9 | return int.Parse(mA.Groups["Num"].Value) -
|
10 | int.Parse(mB.Groups["Num"].Value);
|
11 | }
|
12 | return a.CompareTo(b);
|
Hier wir wenn die Nummer als letztes (vor einer eventuellen
Dateierweiterung) steht und der Text davor gleich ist die Nummer
verglichen, sonst der Text nach dem Standard-Stringvergleich.
Aber Achtung, die Neue Variante ist großteils ungetestet.