Ich versuche, ein Array von Zahlen zu sortieren, die Zeichenfolgen sind, und ich möchte, dass sie numerisch sortiert werden.
Der Haken ist, dass ich die Zahlen nicht in int konvertieren kann .
Hier ist der Code:
string[] things= new string[] { "105", "101", "102", "103", "90" };
foreach (var thing in things.OrderBy(x => x))
{
Console.WriteLine(thing);
}
Ausgabe: 101, 102, 103, 105, 90
Ich möchte: 90, 101, 102, 103, 105
EDIT: Die Ausgabe kann nicht 090, 101, 102 sein ...
Das Codebeispiel wurde aktualisiert, um "Dinge" anstelle von "Größen" zu sagen. Das Array kann ungefähr so aussehen:
string[] things= new string[] { "paul", "bob", "lauren", "007", "90" };
Das heißt, es muss alphabetisch und nach Nummern sortiert werden:
007, 90, Bob, Lauren, Paul
image10
nach kommenimage2
? SollteJanuary
vorher kommenFebruary
?Antworten:
Übergeben Sie einen benutzerdefinierten Vergleicher an OrderBy. Enumerable.OrderBy können Sie einen beliebigen Vergleicher angeben.
Dies ist eine Möglichkeit, dies zu tun:
quelle
IsNumeric
Methode ist schlecht, eine ausnahmegesteuerte Codierung ist immer schlecht. Verwenden Sieint.TryParse
stattdessen. Probieren Sie Ihren Code mit einer großen Liste aus und es wird ewig dauern.Einfach mit Nullen gleicher Länge auffüllen:
quelle
sizes
würde eine Neuzuweisung zu auch nicht funktionieren, da das Ergebnis ein anderer Typ ist. Die Antwort ist insofern kurz, als die zweite Zeile das Ergebnis als Ausdruck zeigt, aber es liegt am Leser, etwas damit zu tun. Ich habe eine weitere Variablenzuweisung hinzugefügt, um dies klarer zu machen.Und wie wäre es damit ...
quelle
"b", "ab", "101", "103", "bob", "abcd"
.Wert ist eine Zeichenfolge
Funktioniert
quelle
string[] { "Object 1", "Object 9", "Object 14" }
"b", "ab", "101", "103", "bob", "abcd"
.In Fenstern gibt es eine native Funktion
StrCmpLogicalW
, die in Zeichenfolgen Zahlen als Zahlen anstelle von Buchstaben vergleicht. Es ist einfach, einen Vergleicher zu erstellen, der diese Funktion aufruft und für ihre Vergleiche verwendet.Es funktioniert sogar mit Zeichenfolgen, die sowohl Text als auch Zahlen enthalten. Hier ist ein Beispielprogramm, das den Unterschied zwischen der Standardsortierung und der
StrCmpLogicalW
Sortierung zeigtwelche Ausgänge
quelle
-1 0 10 2
ist sortiert als0 -1 2 10
Versuche dies
Hinweis: Dies ist hilfreich, wenn alle Zeichenfolgen in int konvertierbar sind.
quelle
ToList()
Vorher =>sizes.ToList().OrderBy(x => Convert.ToInt32(x))
Ich denke, das ist viel besser, wenn die Zeichenfolge eine Zahl enthält. Hoffe es wird helfen.
PS: Ich bin mir nicht sicher über die Leistung oder komplizierte Zeichenfolgenwerte, aber es hat so gut funktioniert:
lorem ipsum
lorem ipsum 1
lorem ipsum 2
lorem ipsum 3
...
lorem ipsum 20
lorem ipsum 21
quelle
Sie sagen, Sie können die Zahlen nicht in int konvertieren, da das Array Elemente enthalten kann, die nicht in int konvertiert werden können, aber es schadet nicht, es zu versuchen:
Dann vergleiche so:
Ausgabe: 007, 90, 90, 101, 102, 103, 105, Bob, Lauren, Paul
quelle
Dies scheint eine seltsame Bitte zu sein und verdient eine seltsame Lösung:
quelle
Diese Site behandelt die alphanumerische Sortierung und sortiert die Zahlen in einem logischen Sinn anstelle eines ASCII-Sinns. Es berücksichtigt auch die Alphas um ihn herum:
http://www.dotnetperls.com/alphanumeric-sorting
BEISPIEL:
Der Code lautet wie folgt:
quelle
Die Antwort von Jeff Paulsen ist richtig, aber das
Comprarer
kann sehr vereinfacht werden:Dies funktioniert, weil das einzige, was auf das Ergebnis der überprüft wird
Comparer
wird, wenn das Ergebnis größer, kleiner oder gleich Null ist. Man kann einfach die Werte von einem anderen subtrahieren und muss die Rückgabewerte nicht verarbeiten.Auch sollte die
IsNumeric
Methode keinentry
-block verwenden müssen und kann davon profitierenTryParse
.Und für diejenigen, die sich nicht sicher sind: Dieser Vergleicher sortiert die Werte so, dass nicht numerische Werte immer an das Ende der Liste angehängt werden. Wenn man sie am Anfang
if
haben will, müssen der zweite und dritte Block getauscht werden.quelle
Versuche dies :
quelle
arr = arr.OrderBy (x => x, neues NaturalSort ()). ToArray ();
Der Grund, warum ich es brauchte, war, in einem Verzeichnis abgelegt zu werden, dessen Dateinamen mit einer Nummer begannen:
quelle
Sortieren Sie nun die Listen und führen Sie sie wieder zusammen ...
Ich habe nur versucht, einen Beitrag zu dieser interessanten Frage zu leisten ...
quelle
Meine bevorzugte Lösung (wenn alle Zeichenfolgen nur numerisch sind):
quelle
quelle
Jeff Paulsen Antwort erweitern. Ich wollte sicherstellen, dass es keine Rolle spielt, wie viele Zahlen- oder Zeichengruppen in den Zeichenfolgen enthalten sind:
Ich habe auch SplitCharsAndNums von einer SO-Seite genommen, nachdem ich sie geändert hatte, um sie mit Dateinamen zu behandeln.
quelle
Obwohl dies eine alte Frage ist, möchte ich eine Lösung geben:
Woha ganz einfach, oder? : D.
quelle
quelle