21

我想使用字符串类的 Equals() 方法比较两个字符串在 C# 中是否相等。但即使两个字符串相同,我的条件检查也失败了。

我已经看到两个字符串是相等的,并且也在http://text-compare.com/站点上验证了这一点。我不知道这里有什么问题......

我的代码是:

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

当我在其中设置一个断点并逐步进行时,观察每个字符,然后 currInnerText 最后一个索引有所不同。它看起来像一个空字符。但我已经使用了 Trim() 函数。这是在调试过程中捕获的图片。

删除 currInnerText 字符串末尾的空字符或任何其他虚假字符的解决方案是什么?

在此处输入图像描述

4

5 回答 5

24

试试这个

String.Equals(currInnerText, paraText, StringComparison.InvariantCultureIgnoreCase);
于 2012-09-27T13:23:17.890 回答
14

就我而言,区别在于空格字符的编码不同,一个字符串包含不间断空格(160),另一个字符串包含普通空格(32)

它可以通过

string text1 = "String with non breaking spaces.";
text1 = Regex.Replace(text1, @"\u00A0", " ");
// now you can compare them
于 2014-11-30T18:08:33.280 回答
12

尝试放置一个断点并检查长度。此外,在某些情况下,如果语言环境不同,equals 函数不会返回 true。您可以尝试的另一种方法(检查长度)是像这样打印---string1---,---string2---,这样,您可以查看是否有任何尾随空格。要解决此问题,您可以使用 string1.trim()

于 2012-09-27T13:16:04.720 回答
7

在调用 .Equals 之前,请尝试以下操作:

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);
    }
}

如果 Equals 返回 false,那应该会引发异常,并且应该让您知道发生了什么。

于 2012-09-27T13:43:37.773 回答
1

除了使用看起来像其他角色但实际上不同的角色之外,使用反射时可能会发生这种情况。反射将值两次装箱到新对象中,==并将通过引用进行比较。尝试object.Equals(currentValue, newValue)改用。

于 2020-08-24T19:10:57.270 回答