【问题标题】:String comparison equivalents字符串比较等价物
【发布时间】:2010-12-25 07:56:26
【问题描述】:

我相信这两条线是等价的,但在遇到一个奇怪的问题后,我不再相信这种情况。

String mimeType = context.Request.ContentType;
(String.Compare("text/xml", mimeType, true) == 0))

等同于:

context.Request.ContentType.ToLower().Equals("text/xml")

它们在 CLR 中的实现有什么不同吗?

【问题讨论】:

    标签: c# .net string clr string-comparison


    【解决方案1】:

    除了其他答案(@SLaks、@Serhio)之外,我还有义务指出 .ToLower() 生成 another 字符串。据我所知,比较没有。如果在频繁调用的代码中,应用程序中过多的字符串生成可能会在内存使用和性能方面给您带来不利影响。

    【讨论】:

      【解决方案2】:

      它们不是等效的,ToLower/ToUpper 可能存在一些本地化问题。在不区分大小写的情况下比较两个字符串的方法(考虑到其中一个字符串可能为空,这就是我不喜欢 str1.Equals 方法的原因)是静态 String.Equals 方法:

      bool areEqual = String.Equals(str1, str2, StringComparison.OrdinalIgnoreCase);
      

      【讨论】:

      • 首选版本,因为null 处理安全,但 Gonzalo 对其他答案的评论也适用于此处,应予以考虑。
      【解决方案3】:

      Compare(string, string, boolean) 在.NET中的实现:

      public static int Compare(string strA, string strB, bool ignoreCase)
      {
          if (ignoreCase)
          {
              return CultureInfo.CurrentCulture.CompareInfo.Compare(strA, strB, CompareOptions.IgnoreCase);
          }
          return CultureInfo.CurrentCulture.CompareInfo.Compare(strA, strB, CompareOptions.None);
      }
      

      等于

      [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
      public bool Equals(string value)
      {
          if ((value == null) && (this != null))
          {
              return false;
          }
          return EqualsHelper(this, value);
      }
      

      那么,不是是一回事吗。

      【讨论】:

        【解决方案4】:

        它们并不完全等价;见here

        这是进行不区分大小写比较的正确方法:

        bool areSame = str1.Equals(str2, StringComparison.OrdinalIgnoreCase);
        

        这种方式也会更有效,因为它不会为小写副本分配单独的字符串。

        【讨论】:

        • 这适用于 99.999% 的情况,但有时可能会失败。见The Turkish-I Problemmsdn.microsoft.com/en-us/library/ms973919.aspx
        • @SLaks:我不确定重点是什么,但OrdinalIgnoreCase 确实解决了土耳其语-I 问题。
        • 在比较 mime 类型时,您不应该“解决”土耳其语 I 问题!
        • 这个答案不是空安全的。即如果 str1 为空
        • @Simon:正确。 String.Equals(a, b, StringComparison.OrdinalIgnoreCase) 会。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-06-10
        • 2015-02-23
        • 1970-01-01
        • 2011-01-08
        • 1970-01-01
        • 2020-06-03
        • 1970-01-01
        相关资源
        最近更新 更多