代码之家  ›  专栏  ›  技术社区  ›  Craig

C语言中字符串比较方法的差异#

  •  243
  • Craig  · 技术社区  · 16 年前

    string testString = "Test";
    string anotherString = "Another";
    
    if (testString.CompareTo(anotherString) == 0) {}
    if (testString.Equals(anotherString)) {}
    if (testString == anotherString) {}
    

    (注意:我在本例中寻求平等,不小于或大于,但也可以自由评论)

    11 回复  |  直到 10 年前
        1
  •  237
  •   Vadim Ovchinnikov    6 年前

    以下是这些功能如何工作的规则:

    stringValue.CompareTo(otherStringValue)

    1. null 在字符串之前
    2. 它使用 CultureInfo.CurrentCulture.CompareInfo.Compare ß 将相当于 SS 在德国或类似国家

    stringValue.Equals(otherStringValue)

    1. 无效的
    2. 除非您指定 StringComparison 选项,它将使用看起来像直接顺序相等检查的内容,即。 ß 不一样 党卫军

    stringValue == otherStringValue

    1. stringValue.Equals() .
    2. 这个 == 操作员调用静态 Equals(string a, string b) 方法(该方法依次进入内部 EqualsHelper 进行比较。
    3. 使命感 .Equals() 无效的 字符串获取 启用时发生引用异常 == 没有。

    Object.ReferenceEquals(stringValue, otherStringValue)

    只需检查引用是否相同,即,它不仅仅是两个具有相同内容的字符串,而是将字符串对象与自身进行比较。


    请注意,对于上面使用方法调用的选项,存在具有更多选项的重载来指定如何进行比较。

    .CompareTo .Equals ,视乎选择而定。

        2
  •  74
  •   FMFF    7 年前

    从MSDN:

    字母排序操作。当主要的 相等的要确定两个字符串是否相等,请调用 等于法。”

    他们建议使用 .Equals .CompareTo 当你只追求平等的时候。我不确定两者之间是否有区别 == string 班我有时会使用 Object.ReferenceEquals == 为了我自己的课程,以防有人在以后出现,并重新定义 那个班的接线员。

        3
  •  50
  •   Noctis    10 年前

    Reflector 是你的朋友:-)

    精确匹配: 编辑:我以前总是使用==运算符,其原理是在Equals(string,string)内部使用object==运算符来比较对象引用,但是strA.Equals(strB)似乎比string.Equals(strA,strB)、strA==strB和string.CompareOrdinal(strA,strB)总体上快1-11%。我用秒表对相同/不同长度和不同尺寸(1B到5MB)的固定/非固定字符串值进行循环测试。

    strA.Equals(strB)
    

    人类可读匹配(西方文化,不区分大小写):

    string.Compare(strA, strB, StringComparison.OrdinalIgnoreCase) == 0
    

    人类可读的匹配(所有其他区域性,不区分大小写/重音/假名等,由CultureInfo定义):

    string.Compare(strA, strB, myCultureInfo) == 0
    

    与自定义规则(所有其他区域性)的可读匹配:

    CompareOptions compareOptions = CompareOptions.IgnoreCase
                                  | CompareOptions.IgnoreWidth
                                  | CompareOptions.IgnoreNonSpace;
    string.Compare(strA, strB, CultureInfo.CurrentCulture, compareOptions) == 0
    
        4
  •  18
  •   Community Egal    7 年前

    Ed 也就是说,CompareTo用于排序。

    基本上

    if(object.ReferenceEquals(left, null) && 
       object.ReferenceEquals(right, null))
        return true;
    if(object.ReferenceEquals(left, null))
        return right.Equals(left);
    return left.Equals(right);
    

    原因很简单,因为以下情况将引发异常:

    string a = null;
    string b = "foo";
    
    bool equal = a.Equals(b);
    

    以下情况不会:

    string a = null;
    string b = "foo";
    
    bool equal = a == b;
    
        5
  •  15
  •   Oskar Berggren    9 年前

    关于字符串比较问题的良好解释和实践可以在本文中找到 New Recommendations for Using Strings in Microsoft .NET 2.0 Best Practices for Using Strings in the .NET Framework .


    StringComparison Enumeration 默认情况下,它们正在使用。有几种选择:

    • 当前文化
    • 不变文化
    • 依次的
    • 普通木糖酶

    上述每种比较类型针对不同的用例:

      • 区分大小写的内部标识符
      • XML和HTTP等标准中的区分大小写的标识符
      • 区分大小写的安全相关设置
    • 普通木糖酶
      • XML和HTTP等标准中不区分大小写的标识符
      • 文件路径(在Microsoft Windows上)
      • 环境变量
      • 资源标识符(例如句柄名称)
      • 不区分大小写的安全相关设置
      • 一些与语言相关的数据
      • 显示需要固定排序顺序的语言数据
      • 向用户显示的数据
      • 大多数用户输入

    字符串比较枚举 以及字符串比较方法的重载,自.NET 2.0以来就存在。


    String.CompareTo Method (String)

    实际上是类型安全的实现吗 IComparable.CompareTo Method

    用法:

    CompareTo方法主要用于排序或字母排序操作

    实现IComparable接口必须使用此方法

    String.Compare Method

    固定成员 String Class

    String.Equals Method

    从对象类重写,并为类型安全而重载。默认解释:序号。 请注意:

    String类的相等方法包括 静态等于 静态运算符== 实例方法等于 .


    StringComparer class

    还有另一种处理字符串比较的方法,特别是用于排序的方法:

    你可以使用 创建特定于类型的比较以对泛型集合中的元素进行排序。Hashtable、Dictionary、SortedList和SortedList等类使用StringComparer类进行排序。

        6
  •  7
  •   viggity    16 年前

    性能通常与99%的执行次数无关,但如果必须在循环中执行数百万次,我强烈建议您使用.Equals或==因为一旦它发现一个不匹配的字符,它就会抛出整个错误,但是,如果使用CompareTo,它将必须找出哪个字符比另一个字符小,从而导致性能时间稍差。

    如果你的应用程序将在不同的国家运行,我建议你看看CultureInfo的含义,并可能使用.Equals。因为我只为美国编写应用程序(不在乎别人是否能正常工作),所以我总是使用==。

        7
  •  5
  •   OwenP    16 年前

    在这里列出的表格中,两者没有太大区别。 CompareTo 最后打电话给 CompareInfo 使用当前区域性进行比较的方法; Equals == 操作人员

    如果你考虑超载,事情就会变得不同。 Compare == 只能使用当前区域性来比较字符串。 String.Compare StringComparison 字符串。比较 允许您指定 CultureInfo

    由于它的多功能性,我发现我使用 字符串。比较 超过任何其他比较方法;它让我精确地指定我想要什么。

        8
  •  2
  •   Rauld    11 年前

    需要注意的一大区别是,如果第一个字符串为null,则.Equals()将引发异常,而==则不会。

           string s = null;
            string a = "a";
            //Throws {"Object reference not set to an instance of an object."}
            if (s.Equals(a))
                Console.WriteLine("s is equal to a");
            //no Exception
            if(s==a)
                Console.WriteLine("s is equal to a");
    
        9
  •  1
  •   John DiFini    6 年前
    • s1==s2: 不容忽视
    • 如果s1为null,则引发NullReferenceException
    • String.Equals(s2,StringComparison): 通过消除过程,这 方法是 赢家 (假设一个典型的用例来确定两个字符串是否相等)!
        10
  •  -1
  •   hometoast    16 年前

    阅读 .

        11
  •  -9
  •   Tom    11 年前

    顺便说一句,这将计算为false

    string a = "myString";
    string b = "myString";
    
    return a==b
    

    a、 这里等于(b)是真的。

    如果您将b更改为:

    b = "MYSTRING";
    

    那么a.Equals(b)是假的,但是

    a.Equals(b, StringComparison.OrdinalIgnoreCase) 
    

    a、 CompareTo(b)调用字符串的CompareTo函数,该函数比较指针处的值并返回<如果存储在a中的值小于存储在b中的值,则为0;如果a.Equals(b)为真,则返回0,并且>否则为0。不过,这是区分大小写的,我认为CompareTo可能有忽略大小写之类的选项,但现在没有时间查看。

    我肯定我漏掉了一些东西,但我认为如果你需要更多的细节,这些信息应该足够开始实验了。