【问题标题】:Something strange in string.compare() [duplicate]string.compare() 中有一些奇怪的东西 [重复]
【发布时间】:2017-03-10 17:42:51
【问题描述】:

这里,我不明白当我将字符串 ".doc" 与字符串 ".exe" 进行比较时,Compare 方法给出 -1 值并返回 false .它必须返回 True 和 1 值作为返回,因为我将其设置为 "==1"

当我将字符串 ".exe" 与字符串 ".txt" 和字符串 ".exe" 进行比较时,它会给出有效的返回值。

谁能告诉我这里到底发生了什么?

int nDocValue = string.Compare(".doc", ".exe");          
Console.WriteLine(nDocValue);                            // Will display -1
Console.WriteLine(string.Compare(".doc", ".exe") == 1);  // False

int nTxtValue = string.Compare(".txt", ".exe");          
Console.WriteLine(nTxtValue);                            // Will display 1
Console.WriteLine(string.Compare(".txt", ".exe") == 1);  // True

int nExeValue = string.Compare(".exe", ".exe");          
Console.WriteLine(nExeValue);                            // Will display 0
Console.WriteLine(string.Compare(".exe", ".exe") == 1);  // False

【问题讨论】:

  • 文档中的预期和描述究竟是什么? String.Compare 返回 0 表示相等,-1 表示较小,1 表示较大。这就是IComparable.Compare 的所有实现方式。
  • 你有很多答案。如果要检查它们是否不同,则必须检查 Compare 返回的内容是否与 0 不同
  • 对不起,我认为如果等于则为真,否则为假。我的错。

标签: c# string


【解决方案1】:

来自 MSDN String.Compare (String strA, String strB) 请参阅返回值部分:

  • 小于零 - 按排序顺序,strA 在 strB 之前。
  • - strA 在排序顺序中出现在与 strB 相同的位置。
  • 大于零 - strA 按照排序顺序在 strB 之后。

这是您的扩展字符串的排序顺序:

.doc
.exe
.txt

在您的第一个示例中,".doc"".exe" 之前,并且您的返回值小于零

注意规范没有说大于零等于1。您不应依赖该值并与== 1 进行比较。您应该与零进行比较。以下是您可能会使用的不同比较

  • result < 0 - 检查 strA 在排序顺序中是否在 strB 之前:string.Compare(".doc", ".exe")
  • result == 0 - 检查 strA 是否等于 strB:string.Compare(".exe", ".exe")
  • result > 0 - 检查 strA 是否按排序顺序排在 strB 之后:string.Compare(".txt", ".exe")

【讨论】:

    【解决方案2】:

    您是否阅读过有关 string.Compare() 的 MSDN 页面?如果第一个字符串小于(按字典顺序)第二个字符串,则返回值 0,如果相等则返回 0。

    doc < exe < txt
    

    请注意,如果您只需要检查是否相等,那么使用== 运算符或string.Equals() 会更好。

    bool bDocValue = string.Equals(".doc", ".exe"); // False
    bool bDocValue2 = ".doc" == ".exe"; // False
    

    【讨论】:

      【解决方案3】:

      你必须只与零比较:

      • 任何负值表示第一个字符串小于

        .doc
        .exe
         ^______ `d` goes before `e`
        
      • 零表示字符串相等

        .exe
        .exe
            ^___ strings are equal
        
      • 任何正值都表示第一个字符串更大

        .txt
        .exe
         ^______ `t` goes after `e`
        

      【讨论】:

        【解决方案4】:

        .Compare()不仅检查是否相等。检查较大、次要或相等。常用于排序算法。检查接口定义。

        https://msdn.microsoft.com/en-us/library/system.collections.icomparer(v=vs.110).aspx

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-08
          • 1970-01-01
          相关资源
          最近更新 更多