eine kleine Frage bezüglich string compare. Ein normaler string compare "sortiert" folgende 3 strings "item_2", "item_1", "item_11".
Das Ergebnis lautet wenig überaschend: "item_1", "item_11", "item_2".
Ich möchte aber folgendes "item_1", "item_2", "item_11". Dabei soll es aber auch egal sein, was hinter der Zahl steht. Daher "item_1z" kommt vor "item_11".
Gibt es da irgendeine Compare logik die das schon beherscht, oder muss ich selber via Regex anfangen was zu implementieren.
Mein Plan wäre foldender:
1) Mit regex aus beiden string's den kompletten Anfangsteil + Digit's extrahieren.
2) Ist einer von beiden matches negativ, den normalen string compare anwerfen.
3) Sind beide matches positiv, dann wird zu erst geprüft ob die beiden "anfangs" string gleich sind, wenn nicht wieder den normalen string compare anwerfen
4) Bin ich bis hier her gekommen einfach die beiden Zahlen miteinander vergleichen, sind diese zufällig gleich, dann einfach den normalen string compare anwerfen
Wie wäre es, wenn du dir eine Klasse für die einzelne Items baust. In der Klasse hast du ein Feld für den Zahlenwert und ein Feld für den String Wert. Desweiteren implementiert die Klasse das Interface IComparable<T>. Du musst die Methode CompareTo(Item item) ausimplementieren. Dort überprüfen, ob der die Stringwerte gleich sind. Ist dies der Fall, die Zahlenwerte miteinander verlgeichen.
Anschließend kannst du über List.Sort() die Liste sortieren lassen.
z.b.
public class Item : IComparable<Item>
{
private int _digit;
private string _str;
public int Digit
{
get { return _digit; }
set { _digit = value; }
}
public string Str
{
get { return _str; }
set { _str = value; }
}
public int CompareTo(Item other)
{
if(_str.CompareTo(other.Str)== 0)
{
return _digit.CompareTo(other.Digit);
}
return _str.CompareTo(other.Str);
}
}
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von davidG am .
„Ich erfand den Begriff «objekt-orientiert», und ich kann sagen, dass ich dabei nicht C++ im Sinn hatte.“ Alan Kay
In der Klasse hast du ein Feld für den Zahlenwert und ein Feld für den String Wert.
Wie gesagt der Wert liegt als STRING vor, deine Lösung funzt also so nicht. Ich müsste erst die digits nach einem speziellen pattern extrahieren, wie ich oben aufgezeigt habe. Das ist ja eigentlich die Problem Stellung, deine aufgezeigte Lösung setzt die eigentliche Lösung ja schon voraus.
Die beiden Links von Th69 sehen sehr vielversprechend aus. Die schau ich mir mal an. Danke
Naja, mir war nicht genau so klar, wo dein Problem liegt und nachdem du schon ein Regex-Pattern gepostet hattest, dachte ich, dass du diese Problem schon gelöst hättest.
Du kannst ja den String-Wert in einen Int Wert casten.
Für Reguläre-Ausdrücke gibt es ein klasse Tool (Regex-Lab) von herbivore mit dem man Patterns erstellen / testen kann: Regex-Lab
Das Pattern, mit dem du zum einen den String-Wert (z.B. Affe) und anschließend den numerischen Wert (1) bekommst, lautet: (\w+)_(\d+)
Bei "affe_1" bekommst du somit für den ersten Wert affe und für den zweiten wert die 1.
danke noch mal für den Link. Der 2te Link von Th69 sah auch viel verprechend aus und funktioniert soweit ohne Fehler. Er ist auch sehr schnell, ob nun aber die Implementierung deines Links oder des externen schneller ist, habe ich noch nicht ausprobiert.