none
String.Equals() soll einfache und doppeltes Hochkommata nicht unterscheiden RRS feed

  • 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
    Freitag, 31. Mai 2019 11:36

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

    Freitag, 31. Mai 2019 20:30
    Moderator
  • 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ß

    Sonntag, 2. Juni 2019 12:56

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

    Freitag, 31. Mai 2019 12:06
  • 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
    Freitag, 31. Mai 2019 16:19
  • 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

    Freitag, 31. Mai 2019 20:30
    Moderator
  • 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ß

    Sonntag, 2. Juni 2019 12:56