Entwickler-Ecke
Basistechnologien - String Split
DareDevil - Mi 18.04.07 15:56
Titel: String Split
So habe mal wieder eine Frage,
ist es möglich das man einen String splittet und dann aber noch die Splitter auch ausgegeben werden.
Greez
Pascal
korken - Mi 18.04.07 16:09
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| char[] delimiterChars = { ' ', ',', '.', ':', '\t' };
string text = "one\ttwo three:four,five six seven"; System.Console.WriteLine("Original text: '{0}'", text);
string[] words = text.Split(delimiterChars); System.Console.WriteLine("{0} words in text:", words.Length);
foreach (string s in words) { System.Console.WriteLine(s); } |
Moderiert von
UGrohne: Beitragsformatierung überarbeitet.
DareDevil - Mi 18.04.07 16:16
soweit bin ich ja auch schon nur da wird dann halt nicht das ",.:" mit ausgegeben
Kha - Mi 18.04.07 18:40
Kurz und knapp: Selbst schreiben ;) . Selbst wenn es solch eine Funktion irgendwo im Internet gäbe, wird die Suche wohl mindestens so viel Zeit wie das Neuschreiben in Anspruch nehmen.
korken - Mi 18.04.07 20:06
Damit gehts:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| char[] delimiterChars = { ' ', ',', '.', ':', '\t' }; string text = "one\ttwo three:four,five six seven"; System.Console.WriteLine("Original text: '{0}'", text);
ArrayList words = new ArrayList(); int index = text.IndexOfAny(delimiterChars); while (index > -1) { words.Add(text.Substring(0, index+1)); text = text.Substring(index + 1); index = text.IndexOfAny(delimiterChars); } words.Add(text); System.Console.WriteLine("{0} words in text:", words.Count); IEnumerator Enumerator = words.GetEnumerator(); while (Enumerator.MoveNext()) { System.Console.WriteLine(Enumerator.Current); } |
Moderiert von
UGrohne: Code- durch C#-Tags ersetzt
DareDevil - Mi 18.04.07 21:27
jo funktioniert thx
habe aber auch schon selber geschrieben
glaube meins ist eher über 3 ecken gemacht
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51:
| if (input != "") { bool breakSplit = false; for (int i = 0; i < input.Length; i++) { switch (input[i]) { case '+': refStringList.Add(input.Substring(0, i)); refStringList.Add("+"); input = input.Remove(0, i + 1); breakSplit = true; break; case '-': refStringList.Add(input.Substring(0, i)); refStringList.Add("-"); input = input.Remove(0, i + 1); breakSplit = true; break; case '*': refStringList.Add(input.Substring(0, i)); refStringList.Add("*"); input = input.Remove(0, i + 1); breakSplit = true; break; case '/': refStringList.Add(input.Substring(0, i)); refStringList.Add("/"); input = input.Remove(0, i + 1); breakSplit = true; break; case '(': refStringList.Add(input.Substring(0, i)); refStringList.Add("("); input = input.Remove(0, i + 1); breakSplit = true; break; case ')': refStringList.Add(input.Substring(0, i)); refStringList.Add(")"); input = input.Remove(0, i + 1); breakSplit = true; break; } if (breakSplit) { break; } } SplitString(input, ref refStringList); } |
unsere leherer will halt das wir es ohne schleife machen und soll halt für einen einfachen mathematischen parser sein
Kha - Do 19.04.07 12:39
DareDevil hat folgendes geschrieben: |
unsere leherer will halt das wir es ohne schleife machen und soll halt für einen einfachen mathematischen parser sein |
Und deine Version ist ohne Schleife ;) ?
Da aller guten Vorschläge drei sind:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| static IEnumerable<string> SplitEx( string input, params char[] seperators) { int position = 0; do { int find = input.IndexOfAny(seperators, position); if (find > -1) { yield return input.Substring(position, find - position); yield return input[find].ToString(); position = find + 1; } else break; } while (true); if (position != input.Length) yield return input.Substring(position); } |
@korken: Benutze bei Enumerators
foreach, ist um Welten einfacher.
DareDevil - Do 19.04.07 13:09
ja so halb ich such halt die position vom operator
@Khabarakh
und wie muss ich jetzt deine funktion aufrufen
hat sich schon mit dem aufrufen erledigt
aber ich blicke bei dem quellecode trotzdem nicht durch
Kha - Fr 20.04.07 16:04
Wenn es um IEnumerable, yield und Konsorten geht, wirst du im SDK unter "Iterator" fündig werden (en: "Iterators (C# Programming Guide)"). Ziemlich geniale Spielzeuge, vor allem wirst du mit Enumerators unabhängig von der Speicherung der Rückgabedaten - der User kann entscheiden, ob er sie in eine Liste oder eine andere Collection speichern oder direkt per foreach ohne Zwischenspeicherung benutzen möchte. Ansonsten hier einmal meine Methode in deiner Vorgehensweise (geraten: dürfte etwas langsamer sein).
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| static IEnumerable<string> SplitEx( string input, params char[] seperators) { int segmentStart = 0; for (int i = 0; i < input.Length; i++) if (Array.IndexOf<char>(seperators, input[i])) { yield return input.Substring(segmentStart, i - segmentStart); yield return input[i].ToString(); segmentStart = i + 1; }
if (segmentStart != input.Length) yield return input.Substring(segmentStart); } |
Die Kommentare lassen sich in etwa auch auf meine erste Version übertragen.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!