2016-07-28 9 views
0

Ich versuche, eine ArrayList mit Zeichenfolgen alphabetisch gefüllt zu sortieren. Wenn ich die Sort-Methode aufruft, scheint das Alphabet gut zu sortieren, aber wenn es Zahlen gibt, scheint die Sort-Methode falsch zu sortieren.Problem mit der Sort-Methode beim Sortieren von Zeichenfolgen mit Zahlen

Nehmen Sie diesen Code zum Beispiel:

ArrayList list = new ArrayList(); 

list.Add ("img149"); 
list.Add ("img15"); 
list.Add ("a"); 

list.Sort(); 

for (int i = 0; i < list.Count(); i++) { 
    Console.WriteLine (list [i]); 
} 

Dies scheint zu drucken:

a 
img_149 
img_15 

die Zeichenfolge "a" sortiert in Ordnung, aber die beiden anderen Saiten falsch sortiert werden. Ich denke, ich verstehe, warum dies so ist, wie "4" vor "5" kommt, 149 ist jedoch wirklich höher als 15, in welchem ​​Fall die Zeichenfolge mit der 15 zuerst gedruckt werden sollte.

Für meine Situation weiß ich nie genau, wie die Strings sein werden (die Strings repräsentieren Dateinamen in meinem Programm), und es ist wichtig, dass die Namen alphabetisch mit den Nummern in der Reihenfolge sortiert sind (1, 2, 150, 300) , etc.). Hat jemand Ideen, wie das zu beheben ist?

+0

Google für Natural Sort. Zeichenketten enthalten Zahlen und keine Zahlen, daher sortieren sie richtig. – Plutonix

+0

Die Lösung, die ich verwendet habe, kann [hier] gefunden werden (http://snipd.net/alphanumericnatural-sorting-in-cusing-icomparer). – JasonFH2K

+0

@Plutonix Vielen Dank für die Erwähnung von Natural Sort. Das ist es, was ich schließlich benutzt habe, um das Problem zu finden, und eine Menge mehr Diskussionen über das Thema. Das erklärt, warum ich vorher nichts darüber gefunden habe - nicht die richtige Terminologie. – JasonFH2K

Antwort

0

Es ist richtig sortiert. Versuchen Sie Folgendes:

List<string> sortedFileNames = list.Cast<string>().OrderBy(s => 
{ 
    string numericStr = Regex.Match(s, @"\d+").Value; 
    if (numericStr == "") 
    { 
     return s; // file name does not include number, so just sort by actual file name. 
    } 
    else 
    { 
     return s + numeric.PadLeft(10, '0'); // file name includes numbers, so sort by file name with number zero-padded to fixed length of 10. 
    } 
}).ToList(); 
+0

Wie ich schon sagte, verstehe ich, dass dies richtig sortiert, aber das ist falsch für mich sortiert. Bitte lesen Sie den Beitrag, wie ich dies im zweiten Absatz deutlich gesagt habe. Ich habe auch gesagt, dass ich nie weiß, was die Strings darstellen, da es sich um Dateinamen handelt, daher kann ich meine Namenskonvention nicht ändern. – JasonFH2K

+0

@SIRmisterD Entschuldigung, ich habe die Antwort aktualisiert. –

+0

Keine Sorgen. :) Wenn ich nun den Code sehe, den du gepostet hast, denke ich nicht, dass das für mich funktionieren würde, weil die Datei, wenn sie Zahlen enthält, nie weiß, wo die Nummer liegt. Daher kann es einige Probleme verursachen, wenn es bei 10 festgelegt wird. – JasonFH2K

Verwandte Themen