Laden...

Alle Indexes von "?" aus einem String speichern

Erstellt von noobee vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.452 Views
N
noobee Themenstarter:in
6 Beiträge seit 2018
vor 5 Jahren
Alle Indexes von "?" aus einem String speichern

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?

1.029 Beiträge seit 2010
vor 5 Jahren

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);
    }
}


N
noobee Themenstarter:in
6 Beiträge seit 2018
vor 5 Jahren

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...

1.029 Beiträge seit 2010
vor 5 Jahren

-- 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

16.834 Beiträge seit 2008
vor 5 Jahren

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.

N
noobee Themenstarter:in
6 Beiträge seit 2018
vor 5 Jahren

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"?

C
224 Beiträge seit 2009
vor 5 Jahren

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.

16.834 Beiträge seit 2008
vor 5 Jahren

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:

  • unsicher
  • nicht testbar
  • ein absoluter Typmissbrauch
  • würde jeden Programmierer verwirren, der den Code lesen muss
  • würde das einen Platz in Coding Styles Horror verdient haben 😃

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.

4.939 Beiträge seit 2008
vor 5 Jahren

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 sicherlich List.ToArray()?

Aber man benötigt eigentlich kein Array, da man mit der List genauso weiter arbeiten kann.