Hallo@community,
ich habe einen String, der als "line" aus dem Array lines[] aus einer Textdatei kommt. Dieser String beinhaltet unbekannt viele "?". Ich möchte gern in einem int[] alle Positionen der "?" speichern.
Mittels string.IndexOf("?", 0) bekomme ich zwar das erste "?", jedoch nicht die restlichen.
Sicherlich könnte ich das 2. auch so finden:
string.IndexOf("?", string.IndexOf("?", 0))
und das 3.
string.IndexOf("?", string.IndexOf("?", string.IndexOf("?", 0)))
usw. Das geht doch aber sicher auch "besser", oder?
Hi,
das ist der Punkt, an dem man eigene Helper schreibt - z.B. in einer while-Schleife.
Gibt zig Varianten - aber im Endeffekt läuft es in etwa auf Folgendes hinaus:
public static IEnumerable<int> AllIndexesOf(this string str, string searchstring)
{
int minIndex = str.IndexOf(searchstring);
while (minIndex != -1)
{
yield return minIndex;
minIndex = str.IndexOf(searchstring, minIndex + searchstring.Length);
}
}
Nochmal danke für die Antwort 😄 Da ich eh n bissi üben muss stellt sich mir die Frage, ob etwas gegen diese "russische" Methode spricht ? Daran hatte ich vorher nicht gedacht
// //////////////////////////////
/// extrahiere alle Positionen von '?'
public string intPositions(string str)
{
int stringLaenge = str.Length;
int counter = 0;
string positions = "";
char ch = '?';
foreach(char c in str){
if(c.Equals(ch)){
positions += counter.ToString()+",";
}
counter++;
}
return positions;
}
Das gibt mir folgenden String zurück, der alle Positionen der '?' enthält, getrennt durch ','
1,5,9,16,62
Das kann man ja nun beliebig weiter verarbeiten, z.B. mittels
str.split(',')
in ein Array speichern...
-- Edit --
Hi,
du hast mich überrascht. So wie du es jetzt gemacht hast ist es nicht gut. String als Rückgabewert ist schlicht unnütz. Tu dir selbst einen Gefallen und
a) Wandle die foreach-Schleife in eine for-Schleife um (dann brauchst du keine manuelle Zählvariable)
b) Leg eine List<int> an und füge dort die Positionen hinzu und gib dann diese Liste zurück
LG
Das kann man ja nun beliebig weiter verarbeiten, z.B. mittels
str.split(',')
in ein Array speichern...
Nein. Nein. Nein.
Das stellt einen absoluten Typ-Missbrauch dar.
Speicher es direkt in einer Liste (List<int> oder IEnumerable<int>), wie es Taipi88 absolut korrekt empfohlen hat.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Mhh, ich würde es von einem String in ein Array quetschen. Nach eurer Methode quetsche ich es von einer Liste oder IEnumerable in ein Array. Warum ist eure Variante besser und warum ist das kein "Typ-Missbrauch"?
Du willst, dass Deine Methode "intPositions" Dir alle Positionen zurückgibt.
Daraus folgt: Als Rückgabewert willst Du eigentlich einen Sammelbehälter für die einzelnen Positionen haben.
Als Sammelbehälter ist ein Integer-Array/-Liste/Enummerierbares Integer Objekt genau das richtige für die Aufgabe.
Ein String verwendet man für Text, aber nicht als Sammelbecken für einen bestimmten Typ. Ein String kann theoretisch alles mögliche sein. Z.B. "Ich, Du auch". Gut, Deine Methode gibt derzeit nur sowas wie "1,5,9,16,62" zurück. Aber der schlecht ausgewählte Typ hat folgende Negativeigenschaften:
*Der komische Rückgabetyp verwirrt Dich zur Zeit zwar nicht, aber andere Personen
*Du musst es mit "split(',')" nachträglich Parsen, um an eine Liste oder Array ranzukommen, die du so schon hättest (Array = Stichwort List.ToArray())
*Es ist fehleranfälliger
Edit: Vorletzten Satz geändert. List.ToString() nach List.ToArray() geändert.
Zu CoLo gesagtem:
Warum ist eure Variante besser und warum ist das kein "Typ-Missbrauch"?
Eine Aufzählung hat in einem String nichts zu suchen. Das ist nicht die Aufgabe eines Strings.
Dafür gibt es von der Programmiersprache eben Elemente wie Listen und Arrays - genau da für sind sie gedacht.
Deine Variante ist:
Mhh, ich würde es von einem String in ein Array quetschen.
Das machst Du so oder so durch Dein Split. 😉 Du nimmst einfach einen unsicheren Umweg über String - das absolut nicht notwendig ist.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Du musst es mit "split(',')" nachträglich Parsen, um an eine Liste ranzukommen, die du so schon hättest (oder quasi hättest. Stichwort List.ToString())
CoLo, du meintest sicherlichList.ToArray()
?
Aber man benötigt eigentlich kein Array, da man mit der List
genauso weiter arbeiten kann.