【问题标题】:Strings with the same contents are not equal?相同内容的字符串不相等?
【发布时间】:2014-07-15 17:01:22
【问题描述】:
public string OpenDialogueFile(string dialogueName) {
    if(dialogues == null) {
        dialogues = Resources.LoadAll<TextAsset>("Dialogue");
    }
    var text = "";
    foreach(var ta in dialogues) {
        print(ta.name + ".." + dialogueName);
        if(ta.name == dialogueName) {
            print("Found");
            text = ta.text;
            break;
        }
    }
    return text;
}

这段代码应该找到一个具有请求名称的纯文本文件并吐出内容。

Resources/Dialogue 中的文件“test1 和 test2”并请求 test1,输出为

test1..test1
Found

但是,当请求 test2 时

test1..test2
test2..test2

程序声称 test2 不等于 test2。

ta.name 和 dialogName 都是字符串,所以它应该是按内容测试相等性。

我的相等操作有问题吗?

【问题讨论】:

  • ta.name 是否声明为字符串?
  • Yes
  • 任一字符串末尾是否有空格?
  • 如果你这样做print("\"" + ta.name + ".." + dialogueName + "\"");,你的输出会得到什么
  • 编码是什么?你确定你只是在这里比较 ASCII 和 ASCII 而不是看起来像“test2”的东西吗?

标签: c# .net unity3d equality


【解决方案1】:

建议使用 String 类的 .equals 方法来比较字符串的相等性,而不是使用 == 运算符。

更多信息请参考the msdn documentationthis * post

使用 .equals 而不是 == 应该可以解决您的问题,而无需求助于疯狂的骇人听闻的变通方法

【讨论】:

    【解决方案2】:

    你是对的,“test2”应该等于“test2”。使用 string.ToCharArray() 方法将字符串转换为 char 数组以检测问题。检查字符数及其值。可能是编码问题。

    【讨论】:

      【解决方案3】:

      在比较它们之前尝试从空格中清除字符串

      var cleanDialogueName = dialogueName.Trim();
      foreach(var ta in dialogues) 
      {
          var cleanName = ta.name.Trim();
      
          print(cleanName + ".." + cleanDialogueName);
          if (cleanName == cleanDialogueName)
          {
              print("Found");
              text = ta.text;
              break;
          }
       }
      

      【讨论】:

      • 2 个问题。首先它应该是char.IsLetterOrDigit(c),其次,它有潜在的危险,因为它会删除所有空格,所以"abc def" 等于"a bcdef "
      • 修复了代码。 OP 需要告诉我们这些字符串中是否可以有空格
      • 我不喜欢把它们去掉,我宁愿像这样从头/尾修剪ta.name.Trim()
      • 修改为使用 Trim()。谢谢@DavidG
      • 这解决了它,关于那个空白是如何进入那里的任何想法?文件名中没有空格,请求也没有。
      最近更新 更多