Laden...

wie ermittle ich, das "fbx" gleich "FBX" ist?

Erstellt von dodo502b vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.430 Views
D
dodo502b Themenstarter:in
49 Beiträge seit 2006
vor 14 Jahren
wie ermittle ich, das "fbx" gleich "FBX" ist?

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

946 Beiträge seit 2008
vor 14 Jahren
string.Compare("abc", "ABC", true);

mfg
SeeQuark

49.485 Beiträge seit 2005
vor 14 Jahren

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

664 Beiträge seit 2005
vor 14 Jahren
3.971 Beiträge seit 2006
vor 14 Jahren

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

49.485 Beiträge seit 2005
vor 14 Jahren

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

3.971 Beiträge seit 2006
vor 14 Jahren

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

D
dodo502b Themenstarter:in
49 Beiträge seit 2006
vor 14 Jahren

vielen dank an alle, das hat mir geholfen. Die Sache mit den Cultures verwirren nur.

49.485 Beiträge seit 2005
vor 14 Jahren

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