【问题标题】:A case-insensitive list不区分大小写的列表
【发布时间】:2009-10-07 10:26:17
【问题描述】:

我需要一个不区分大小写的列表或集合类型(字符串)。创建一个最简单的方法是什么?您可以指定要对 Dictionary 的键进行比较的类型,但我找不到 List 的类似内容。

【问题讨论】:

    标签: c# .net collections


    【解决方案1】:

    使用 Linq,这会为 .Compare 添加一个新方法

    using System.Linq;
    using System.Collections.Generic;
    
    List<string> MyList = new List<string>();
    
    MyList.Add(...)
    
    if (MyList.Contains(TestString, StringComparer.CurrentCultureIgnoreCase)) {
        //found
    }
    

    【讨论】:

    • 你不需要 'Linq' 来使用 Contains 方法
    • @geo1701:但您确实需要 using System.Linq 使用StringComparer 获得新的重载!
    • 谢谢,很好的答案,我希望有一个扩展,而不是自己写。否则我不知道去哪里找!
    【解决方案2】:

    假设您使用的是 .NET 3.5,您可以使用:

    var strings = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase);
    

    ...或类似的东西,您也可以在其中选择适当的文化设置。

    列表在大多数情况下实际上并没有比较的想法 - 只有当您调用 IndexOf 和相关方法时。我不相信有任何方法可以指定要使用的比较。但是,您可以将List&lt;T&gt;.Find 与谓词一起使用。

    【讨论】:

    • 我被.Net 2 卡住了 :(
    【解决方案3】:

    看起来可以利用 KeyedCollection 类:

    public class Set<T> : KeyedCollection<T,T>
    {
        public Set()
        {}
    
        public Set(IEqualityComparer<T> comparer) : base(comparer)
        {}
    
        public Set(IEnumerable<T> collection)
        {
            foreach (T elem in collection)
            {
                Add(elem);
            }
        }
    
        protected override T GetKeyForItem(T item)
        {
            return item;
        }
    }
    

    【讨论】:

      【解决方案4】:

      类似的故事在这里寻找contains

      例如

      public static bool Contains(this string source, string toCheck, StringComparison comp)
              {
                  return source.IndexOf(toCheck, comp) >= 0;
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-26
        • 2019-02-06
        • 2016-12-25
        • 1970-01-01
        • 2013-04-17
        • 1970-01-01
        相关资源
        最近更新 更多