如何使字典不区分大小写

时间:2016-07-27 21:13:09

标签: c#

我试图使Dictionary不区分大小写。 但是,我将其声明为属性,如何使其不敏感。

我知道在定义时,我可以使用它:

var dict = new Dictionary<string, YourClass>(
        StringComparer.InvariantCultureIgnoreCase);

但是,我在我的界面和类中分别定义它

IDictionary<string, string> dict { get; }
public Dictionary<string, string> dict { get; set; }

如何使此案例不敏感?

4 个答案:

答案 0 :(得分:4)

你提到你在你的班级中定义它,如:

public Dictionary<string, string> dict { get; set; }

因此,不要使用短格式表示自动属性,而是使用完整格式:

Dictionary<string, string> _dict = new Dictionary<string, string>(
    StringComparer.InvariantCultureIgnoreCase);
public Dictionary<string, string> dict
{
    get { return _dict; }
    set { _dict = value; }
}

如果您使用的是C#6.0,您甚至可以使用新的自动属性初始化程序语法编写它:

public Dictionary<string, string> dict { get; set; } = new Dictionary<string, string>(
    StringComparer.InvariantCultureIgnoreCase);

链接:

答案 1 :(得分:3)

您可以在类或接口级别强制执行它的唯一方法是创建一个新的派生类型并使用该类型。

public class CaseInsensitiveDictionary<TValue> : Dictionary<string, TValue>
{
    public CaseInsensitiveDictionary() : base(StringComparer.InvariantCultureIgnoreCase)
    {
    }
}

然后在你的界面中你会做

CaseInsensitiveDictionary<YourClass> { get; }

答案 2 :(得分:1)

你做不到。比较器是只读属性(https://msdn.microsoft.com/en-us/library/ms132092(v=vs.110).aspx)。在构造对象时声明你的比较器。

允许在运行时更改比较器会产生严重问题,因为它可能导致突然的密钥冲突,这需要重新构建字典。

答案 3 :(得分:0)

如果不区分大小写是合同的一部分,那么你真正想做的就是将这个逻辑封装在其他内容中,然后在你的界面上公开它。

根据您尝试公开的具体功能,这样简单的事情可能会起到作用:

public class CaseInsensitiveIndex
{
    private readonly Dictionary<string, object> _collection = 
        new Dictionary<string, object>();

    public object this[string index]
    {
        get { return _collection[index.ToLower()]; }
        set { _collection[index.ToLower()] = value; }
    }
}

public interface IHasCaseInsensitiveIndex
{
    CaseInsensitiveIndex Index { get; }
}

通过这样的界面公开展示集合似乎有点奇怪(这感觉它应该是一个内部实现细节......但这取决于上下文 - 考虑你的封装是否需要工作)但是这是你能想到的最接近你想要达到的目标。