IndexOf und ordinale Zeichenfolgenvergleiche

8

Mein Problem ist, dass String.IndexOf % zurückgibt Code%. Ich würde erwarten, dass es -1 zurückgibt.

Die Parameter:

0 = text (beachten Sie das Kombinieren von Seagull Below Zeichen)

C:\Users\User\Desktop\Sync\̼ = stringToTrim

Wenn ich mit C:\Users\User\Desktop\Sync\ nach dem Index suche, ist der Wert von int index = text.IndexOf(stringToTrim); index . Ich fand, dass die Verwendung eines ordinalen String-Vergleichs dieses Problem von mir löste:

%Vor%

Online lesen, viele Unicode-Zeichen (wie U + 00B5 und U + 03BC ) map auf das gleiche Symbol, so dass es eine gute Idee wäre, dies zu erweitern und normalisieren Sie beide Zeichenfolgen:

%Vor%

Ist dies der richtige Ansatz, um zu überprüfen, bei welchem ​​Index eine Zeichenfolge alle aufeinander folgenden Zeichen einer anderen Zeichenfolge enthält? Die Idee ist also, dass Sie normalisieren, wenn Sie überprüfen wollen, ob Symbole übereinstimmen, aber Sie normalisieren sich nicht, wenn Sie Zeichen anhand ihrer codierten Werte überprüfen möchten (also doppelte Symbole zulassen)? Könnte jemand bitte erklären, warum -1 am Anfang der Zeichenfolge keine Übereinstimmung gefunden hat? Mit anderen Worten, was macht es tatsächlich unter den Deckungen? Ich hätte erwartet, dass es beginnt, Zeichen vom Anfang der Zeichenfolge bis zum Ende der Zeichenfolge zu suchen.

    
Alexandru 15.12.2014, 20:32
quelle

2 Antworten

6

Das Verhalten macht für mich vollkommen Sinn. Sie verwenden ein kombinierendes Zeichen, das mit dem vorhergehenden Zeichen kombiniert ist, und verwandelt es in ein anderes Zeichen, das nicht mit dem Zeichen '\' übereinstimmt, das Sie am Ende der Suche angegeben haben Zeichenfolge. Dadurch wird verhindert, dass die gesuchte Zeichenfolge gefunden wird. Wenn du stattdessen nach "C:\Users\User\Desktop\Sync" gesucht hättest, hättest du es gefunden.

Mit StringComparison.Ordinal wird .NET angewiesen, die verschiedenen Regeln für Zeichen zu ignorieren und nur auf ihren genauen Ordnungswert zu achten. Dies scheint zu tun, was Sie wollten, also ja ... das sollten Sie tun.

Der "korrekte Ansatz" hängt vollständig davon ab, welches Verhalten Sie wünschen. Eine große Anzahl von String-Manipulationen beinhaltet, dass Text dem Benutzer präsentiert wird oder von ihm bereitgestellt wird und in einer kulturbewussten und Unicode-bewussten Weise ausgeführt werden sollte. Zu anderen Zeiten ist das nicht wünschenswert. Es ist wichtig, den richtigen Ansatz für Ihre Bedürfnisse auszuwählen.

    
Peter Duniho 15.12.2014, 20:48
quelle
1

Ja, Sie sollten StringComparison.Ordinal verwenden, um zu garantieren, dass die Kultur beim Vergleichen des Werts ignoriert wird. Dies ist besonders für alle Strings notwendig, die standardmäßig "kulturinvariant" sind. Dazu gehören Dateipfade.

Wenn nicht StringComparison.Ordinal verwendet wird, ist es möglich, subtile Fehler einzuführen: Ссылка

  

Wenn kulturell unabhängige String-Daten wie XML-Tags, HTML-Tags,   Benutzernamen, Dateipfade und die Namen von Systemobjekten sind   interpretiert, als wären sie kultursensitiv, kann Anwendungscode sein   Subtile Bugs, schlechte Leistung und in einigen Fällen Sicherheit   Probleme.

Einige Nebenvorteile von StringComparison.Ordinal sind eine bessere Leistung: Ссылка

    
PiotrWolkowski 15.12.2014 20:48
quelle

Tags und Links