Benutzer mit den meisten Antworten
String.Equals() soll einfache und doppeltes Hochkommata nicht unterscheiden

Frage
-
Hallo Leute,
folgender Code erkennt beide Strings als ungleich, sofern das Hochkommata des ersten Strings einfach und das des Anderen doppelt ist. Gibt es irgendeine Möglichkeit, den Code so abzuändern, dass beide Strings als gleich erkannt werden. Das soll nur die Hochkommata betreffen!
string item2BeInclued = additionalContent.newItem.Replace("#@", " "); foreach(string item in listContentOfConfig) { if(item.Equals(item2BeInclued)) { _logger.Warn("{0} already has been found in {1}", item2BeInclued, configName); break; } }
Beispiel:
bool abc; string basic = "Fuchs!"; string s1 = "'\u0022'" + basic + " '\u0022'"; string s2 = " ' " + basic + " '"; if(s1.Equals(s2)) abc = true; //soll gegeben sein... else abc = false; // ist gegeben, aber so nicht erwünscht
- Bearbeitet tklustig Freitag, 31. Mai 2019 11:53
Antworten
-
Hi,
nö, das geht nicht. Wie sollte es auch? " ist nunmal nicht '.
Ich würde die beiden Zeichen per Replace entfernen, alternativ bspw. " durch ' ersetzen und dann vergleichen (natürlich in einer eigenen Variablen, damit der Originalinhalt erhalten bleibt).
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport- Als Antwort vorgeschlagen Guido Franzke Montag, 3. Juni 2019 08:19
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Donnerstag, 13. Juni 2019 07:58
-
Hi,
ich würde da eventuell einfach eine Erweiterungsmethode schreiben, z.B. so:
public static class MyStringExtensions { public static bool MyEquals(this string s1, string s2, StringComparison sc = StringComparison.CurrentCulture) {
string az1 = "\"";
string az2 = "'";if (s1 == null && s2 == null) return true; if (s1 == null || s2 == null) return false; return string.Equals(Strip(s1), Strip(s2), sc); // Für den Vergleich werden eventuelle Hochkommata entfernt. string Strip(string chk) => IsEnclosed(chk) ? chk.Substring(1, chk.Length - 2) : chk; // Es wird nur geprüft, ob sowohl Anfang und Ende // aus dem selben Hochkommata bestehen. bool IsEnclosed(string chk) => (chk.StartsWith(az1) && chk.EndsWith(az1)) || (chk.StartsWith(az2) && chk.EndsWith(az2)); } }
Anwendung / einige Tests:
[TestClass()] public class MyStringExtensionsTests { [TestMethod()] public void MyEqualsTest() { string basic = "Fuchs!"; string s1 = $"'{basic}'"; string s2 = $"\"{basic}\""; Assert.IsTrue(s1.MyEquals(s2)); Assert.IsTrue(s2.MyEquals(s1)); Assert.IsTrue(s1.ToLower().MyEquals(s2, StringComparison.OrdinalIgnoreCase)); Assert.IsTrue(s2.ToLower().MyEquals(s1, StringComparison.OrdinalIgnoreCase)); Assert.IsFalse(s1.ToLower().MyEquals(s2, StringComparison.CurrentCulture)); Assert.IsFalse(s2.ToLower().MyEquals(s1, StringComparison.CurrentCulture)); } }
Gruß
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Mittwoch, 5. Juni 2019 13:14
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Donnerstag, 13. Juni 2019 07:58
Alle Antworten
-
Hi Thomas,
die beiden Zeichenketten können nicht gleich sein, da in der zweiten Zeichenkette vor und nach dem Apostroph noch jeweils ein Leerzeichen steht.--
Best Regards / Viele Grüße
Peter Fleischer (former MVP for Developer Technologies)
Homepage, Tipps, Tricks -
Nun, auch so sind sie nicht gleich...
static void Main(string[] args) { bool abc; string basic = "Fuchs!"; string s1 = "\u0022" + basic + "\u0022"; string s2 = "'" + basic + "'"; if (s1.Equals(s2)) abc = true; //soll gegeben sein... else abc = false; // ist gegeben, aber so nicht erwünscht if (abc) Console.WriteLine("{0} ist dasselbe wie {1}", s1, s2); else Console.WriteLine("{0} ist nicht dasselbe wie {1}", s1, s2); Console.ReadKey(); }
Ausgabe:
"Fuchs!" ist nicht dasselbe wie 'Fuchs!'
Ich hätte es aber gerne als gleich eingestuft, möglichst mit der Methode String.Equals(string2,StringComparison comparisonType).
Geht das überhaupt?
- Bearbeitet tklustig Freitag, 31. Mai 2019 16:30
-
Hi,
nö, das geht nicht. Wie sollte es auch? " ist nunmal nicht '.
Ich würde die beiden Zeichen per Replace entfernen, alternativ bspw. " durch ' ersetzen und dann vergleichen (natürlich in einer eigenen Variablen, damit der Originalinhalt erhalten bleibt).
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport- Als Antwort vorgeschlagen Guido Franzke Montag, 3. Juni 2019 08:19
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Donnerstag, 13. Juni 2019 07:58
-
Hi,
ich würde da eventuell einfach eine Erweiterungsmethode schreiben, z.B. so:
public static class MyStringExtensions { public static bool MyEquals(this string s1, string s2, StringComparison sc = StringComparison.CurrentCulture) {
string az1 = "\"";
string az2 = "'";if (s1 == null && s2 == null) return true; if (s1 == null || s2 == null) return false; return string.Equals(Strip(s1), Strip(s2), sc); // Für den Vergleich werden eventuelle Hochkommata entfernt. string Strip(string chk) => IsEnclosed(chk) ? chk.Substring(1, chk.Length - 2) : chk; // Es wird nur geprüft, ob sowohl Anfang und Ende // aus dem selben Hochkommata bestehen. bool IsEnclosed(string chk) => (chk.StartsWith(az1) && chk.EndsWith(az1)) || (chk.StartsWith(az2) && chk.EndsWith(az2)); } }
Anwendung / einige Tests:
[TestClass()] public class MyStringExtensionsTests { [TestMethod()] public void MyEqualsTest() { string basic = "Fuchs!"; string s1 = $"'{basic}'"; string s2 = $"\"{basic}\""; Assert.IsTrue(s1.MyEquals(s2)); Assert.IsTrue(s2.MyEquals(s1)); Assert.IsTrue(s1.ToLower().MyEquals(s2, StringComparison.OrdinalIgnoreCase)); Assert.IsTrue(s2.ToLower().MyEquals(s1, StringComparison.OrdinalIgnoreCase)); Assert.IsFalse(s1.ToLower().MyEquals(s2, StringComparison.CurrentCulture)); Assert.IsFalse(s2.ToLower().MyEquals(s1, StringComparison.CurrentCulture)); } }
Gruß
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Mittwoch, 5. Juni 2019 13:14
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Donnerstag, 13. Juni 2019 07:58