21

文字列クラスの Equals() メソッドを使用して、C# で 2 つの文字列が等しいかどうかを比較したいと考えています。しかし、両方の文字列が同じであっても、私の条件チェックは失敗しています。

両方の文字列が等しいことを確認し、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...
              }
   }
}

ブレークポイントを入れて、1文字ずつ見ていくと、currInnerTextの最後のインデックスに違いがあります。空の文字のように見えます。しかし、Trim() 関数は既に使用しています。これは、デバッグ プロセス中にキャプチャされた画像です。

currInnerText 文字列の末尾にある空の文字またはその他の偽の文字を削除するための解決策は何ですか?

ここに画像の説明を入力

4

5 に答える 5

24

これを試して

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

In my case, the difference was different encoding of space character, one string contained non-breaking space (160) and the other one contained normal space (32)

it can be solved by

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にならない場合もあります。試すことができるもう1つの方法(長さをチェックする)は、次のように両方を印刷することです--- string 1 ---、--- string 2 ---このようにして、末尾にスペースがあるかどうかを確認できます。これを修正するには、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 に答える