Hallo,
ich habe zwei strings und würde gerne herausfinden ob sie "identisch" sind, sie sollen ohne berücksichtigung von Groß-Kleinbuchstaben verglichen werden. Jedoch darf ich nicht ToUpper oder ToLower verwenden, da ansonsten z.B. in der Culture für türkisch "tr-TR" es zu problemen kommen kann. Kann einer helfen?
Danke
in c wäre das stricmp( "fbx", FBX" )
Hallo dodo502b,
Jedoch darf ich nicht ToUpper oder ToLower verwenden, da ansonsten z.B. in der Culture für türkisch "tr-TR" es zu problemen kommen kann.
wenn das tatsächlich ein Problem ist, würde ich mich nicht darauf verlassen, dass bei Verwendung von ignoreCase bei String.Compare alles gut geht.
herbivore
Bei ToUpper/ToLower kannst du eine Kultur angeben, die für Großbuchstaben/Kleinbuchstaben beachtet werden soll. Wie im Beispiel von String.ToUpperInvariant ist somit ein türkisches großes "indigo" ungleich eines deutschen großen "indigo"`s
@SeeQuark,
laut Doku von MS soll string.Compare nur fürs Sortieren verwendet werden. Um zu prüfen, ob zwei Zeichenfolgen gleich sind, sollte string.Equals verwendet werden.
Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...
Hallo kleines_eichhoernchen,
dank deinem Wink per PM habe ich den entsprechenden Hinweis in der Doku gefunden:
Die Compare(String, String, CultureInfo, CompareOptions)-Methode ist hauptsächlich für Sortierungsvorgänge und alphabetische Sortierungsvorgänge konzipiert. Sie sollte nicht verwendet werden, wenn der primäre Zweck des Methodenaufrufs darin besteht, zu bestimmen, ob zwei Zeichenfolgen identisch sind (d. h. wenn mit dem Methodenaufruf eine Überprüfung auf einen Rückgabewert von 0 (null) ausgeführt werden soll). Rufen Sie die Equals-Methode auf, um zu bestimmen, ob zwei Zeichenfolgen identisch sind.
Wie du sagst, steht dieser nur in der Doku für diese eine Überladung von Compare. Das finde ich interessant. Außerdem wird leider kein Grund angegeben. Es ist also nicht klar, ob der Hinweis sich einfach auf die Lesbarkeit des Code bezieht (Equals ist leichter zu lesen und zu verstehen als Compare == 0) oder ob es noch einen tieferen Sinn (bei genau dieser Überladung) gibt. Vielleicht weiß ja einer der anderen was näheres dazu.
herbivore
Hallo Herbivore,
Innerhalb von Equals verwendet Microsoft auch Compare.
public static bool Equals(String a, String b, StringComparison comparisonType) {
if( comparisonType < StringComparison.CurrentCulture || comparisonType > StringComparison.OrdinalIgnoreCase) {
throw new ArgumentException(Environment.GetResourceString("NotSupported_StringComparison"), "comparisonType");
}
if ((Object)a==(Object)b) {
return true;
}
if ((Object)a==null || (Object)b==null) {
return false;
}
switch (comparisonType) {
case StringComparison.CurrentCulture:
return (CultureInfo.CurrentCulture.CompareInfo.Compare(a, b, CompareOptions.None) == 0);
case StringComparison.CurrentCultureIgnoreCase:
return (CultureInfo.CurrentCulture.CompareInfo.Compare(a, b, CompareOptions.IgnoreCase) == 0);
case StringComparison.InvariantCulture:
return (CultureInfo.InvariantCulture.CompareInfo.Compare(a, b, CompareOptions.None) == 0);
case StringComparison.InvariantCultureIgnoreCase:
return (CultureInfo.InvariantCulture.CompareInfo.Compare(a, b, CompareOptions.IgnoreCase) == 0);
case StringComparison.Ordinal:
return EqualsHelper(a, b);
case StringComparison.OrdinalIgnoreCase:
if( a.Length != b.Length)
return false;
else {
// If both strings are ASCII strings, we can take the fast path.
if (a.IsAscii() && b.IsAscii()) {
return (String.nativeCompareOrdinal(a, b, true) == 0);
}
// Take the slow path.
return (TextInfo.CompareOrdinalIgnoreCase(a, b) == 0);
}
default:
throw new ArgumentException(Environment.GetResourceString("NotSupported_StringComparison"), "comparisonType");
}
}
Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...
vielen dank an alle, das hat mir geholfen. Die Sache mit den Cultures verwirren nur.
Hallo dodo502b,
was aber nicht an der CultureInfo-Klasse liegt, sonder daran, dass es einige verwirrende Unterschiede in den verschiedenen menschlichen Kulturen gibt 😃 Die kann das Framework ja nicht ignorieren, sondern muss sie berücksichtige, was mit der CultureInfo-Klasse im Großen und Ganzen ja gut gelungen ist.
herbivore