一个不区分大小写的列表

21
我需要一个不区分大小写的字符串集合类型(列表或集合)。有什么最简单的方法可以创建它?你可以指定字典键的比较类型,但是我找不到类似的东西用于列表。
4个回答

33

假设你正在使用 .NET 3.5,你可以直接使用:

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

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

列表在大多数情况下没有比较的概念 - 只有当您调用IndexOf和相关方法时才有。我认为没有任何方法可以指定用于该比较的比较方式。但是,您可以使用带谓词的List<T>.Find


1
我很遗憾地被困在 .Net 2 中 :( - Grzenio

23

使用 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方法。 - George Filippakos
@geo1701:但是你确实需要使用using System.Linq才能获得带有StringComparer的新重载! - marc_s
谢谢,好答案,我希望有一个扩展,而不是编写自己的代码。否则我就不知道该去哪里找了! - Abacus
然而,这并不能帮助一个实际上获取到列表中的项目... - David V. Corbin

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;
    }
}

2
这里有一个类似的故事,我们正在寻找检查包含的方法。
例如:
public static bool Contains(this string source, string toCheck, StringComparison comp)
        {
            return source.IndexOf(toCheck, comp) >= 0;
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接