【问题标题】:How can I make Array.Contains case-insensitive on a string array?如何使 Array.Contains 在字符串数组上不区分大小写?
【发布时间】:2009-06-04 19:40:08
【问题描述】:

我在字符串数组上使用Array.Contains 方法。我怎样才能让它不区分大小写?

【问题讨论】:

    标签: .net


    【解决方案1】:
    array.Contains("str", StringComparer.OrdinalIgnoreCase);
    

    或者根据具体情况,您可能更喜欢:

    array.Contains("str", StringComparer.CurrentCultureIgnoreCase);
    array.Contains("str", StringComparer.InvariantCultureIgnoreCase);
    

    【讨论】:

    • Per msdn.microsoft.com/en-us/library/dd465121.aspx,“不变的区域性几乎没有可用于比较的属性。”在几乎所有您不想进行特定文化比较的情况下 (CurrentCulture),您应该使用 Ordinal 而不是 InvariantCulture。
    • @bdukes 这句话太强了。使用InvariantCulture 是有正当理由的。使用上述三个选项中的任何一个都取决于具体情况。我不反对您重新排序,但我删除了“可能不是”的评论。答案中已经明确表明,您应该选择在当前情况下适合您的那个。
    • 我花了一点时间才意识到 Contains 是 System.Linq 中的扩展方法。
    • LINQ 再次拯救世界。
    • @MehrdadAfshari 在这种情况下,前面的评论是完全有效的。 “包含”只需要检查相等性,使用序数比较更有效。其他具有“文化”意识的比较与字符排序有关,因此仅与排序有关。
    【解决方案2】:

    我这边的一些重要说明,或者至少将一些分布式信息放在一个地方-关于上面的提示,使用 StringComparer,例如:

    if (array.Contains("str", StringComparer.OrdinalIgnoreCase))
    {}
    
    1. array.Contains() 是一种 LINQ 扩展方法,因此仅适用于 .NET 3.5 或更高版本的标准,需要:
      using System;
      using System.Linq;

    2. 但是:在 .NET 2.0 中,简单的 Contains() 方法(不考虑不区分大小写)至少可以像这样使用强制转换:

      if ( ((IList<string>)mydotNet2Array).Contains(“str”) ) {}

      由于 Contains() 方法是 IList 接口的一部分,这不仅适用于数组,还适用于列表等。

    【讨论】:

      【解决方案3】:

      实现一个自定义IEqualityComparer,考虑不区分大小写。

      另外,请检查this。那么(理论上)你所要做的就是:

      myArray.Contains("abc", ProjectionEqualityComparer<string>.Create(a => a.ToLower()))
      

      【讨论】:

      • 因为直到 5 分钟前我还不知道存在 StringComparer。 :)
      【解决方案4】:
      new[] { "ABC" }.Select(e => e.ToLower()).Contains("abc") // returns true
      

      【讨论】:

      • 但这不会对列表中的每个项目执行代价高昂的 ToLower() 调用吗?带有 StringComparison 重载的 String.Equals 更适合此示例。
      猜你喜欢
      • 1970-01-01
      • 2011-08-18
      • 1970-01-01
      • 1970-01-01
      • 2022-11-22
      • 2013-04-07
      • 1970-01-01
      • 2016-01-26
      • 1970-01-01
      相关资源
      最近更新 更多