2012-09-27 12 views
5

Quiero comparar si dos cadenas son iguales o no en C# utilizando el método Equals() de la clase de cadena. Pero a pesar de que ambas cadenas son las mismas, mi verificación condicional está fallando.El método String Equals() falla aunque las dos cadenas son las mismas en C#?

He visto que ambas cadenas son iguales y también lo he verificado en el sitio http://text-compare.com/. No sé cuál es el problema aquí ...

Mi código es:

protected string getInnerParaOnly(DocumentFormat.OpenXml.Wordprocessing.Paragraph currPara, string paraText) 
     { 
      string currInnerText = ""; 
      bool isChildRun = false; 

     XmlDocument xDoc = new XmlDocument(); 
     xDoc.LoadXml(currPara.OuterXml); 
     XmlNode newNode = xDoc.DocumentElement; 

     string temp = currPara.OuterXml.ToString().Trim(); 

     XmlNodeList pNode = xDoc.GetElementsByTagName("w:p"); 
     for (int i = 0; i < pNode.Count; i++) 
     { 
      if (i == 0) 
      { 
       XmlNodeList childList = pNode[i].ChildNodes; 
       foreach (XmlNode xNode in childList) 
       { 
        if (xNode.Name == "w:r") 
        { 
         XmlNodeList childList1 = xNode.ChildNodes; 
         foreach (XmlNode xNode1 in childList1) 
         { 
          if (xNode1.Name == "w:t" && xNode1.Name != "w:pict") 
          { 
           currInnerText = currInnerText + xNode1.InnerText; 
          } 
         } 
        } 
       } 
       if (currInnerText.Equals(paraText)) 
       { 
        //do lot of work here... 
       } 
    } 
} 

Cuando pongo un punto de ruptura en e ir paso a paso, viendo cada uno y todos los personajes, entonces hay es una diferencia en currInnerText último índice. Parece un char vacío. Pero ya utilicé la función Trim(). Esta es la imagen capturada durante el proceso de depuración.

¿Cuál es la solución para eliminar el carácter vacío o cualquier otro carácter espurio al final de la cadena currInnerText?

enter image description here

+10

Ese no es su código real ('Equals()' no está todo en minúscula en C#). Por favor pegue su código actual. – BoltClock

+0

Claramente hay algo que no nos está diciendo. El código que presentó definitivamente funcionará si está comparando dos cadenas que son iguales. Necesitamos ver más de tu código. –

+1

¿Cuáles son sus cadenas? – SeToY

Respuesta

7

trate de poner un punto de interrupción y el control de la longitud. Además, en algunos casos, si la configuración regional no es la misma, la función igual no da como resultado verdadero. Otro método que podrías probar (verificar la longitud) es imprimir ambos como este --- cadena1 ---, --- cadena2 ---, de esta manera, podrías ver si tienes espacios al final. Para solucionar este problema, puede utilizar string1.trim()

+0

Gracias ... Lo comprobaré – Saravanan

10

probar este

String.Equals(currInnerText, paraText, StringComparison.InvariantCultureIgnoreCase); 
3

Antes de llamar .equals, intenta esto:

if (currInnerText.Length != paraText.Length) 
    throw new Exception("Well here's the problem"); 

for (int i = 0; i < currInnerText.Length; i++) { 
    if (currInnerText[i] != paraText[i]) { 
     throw new Exception("Difference at character: " + i+1); 
    } 
} 

Eso debería lanzar una excepción si se vuelve falsa y Equivale debería darte una idea de lo que está pasando.

+0

: gracias por sus lindas técnicas de seguimiento ... Lo actualizaré mañana – Saravanan

8

En mi caso la diferencia fue la codificación de carácter de espacio, una cadena contenida espacio de no separación (160) y el otro contenían espacio normal (32)

se puede resolver por

string text1 = "String with non breaking spaces."; 
text1 = Regex.Replace(text1, @"\u00A0", " "); 
// now you can compare them 
+2

Usted me salvó la vida;). Gracias –

+1

Esto funcionó para mí. En mi caso, estaba leyendo un texto de db y otro creando en el programa y luego combinando dos. –

Cuestiones relacionadas