如何使字典不区分大小写

本文关键字:大小写 不区 字典 何使 | 更新日期: 2023-09-27 17:59:08

我正在尝试使Dictionary不区分大小写。但是,我声明它是一种财产,我怎么能不敏感呢。

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

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

但是,我在我的接口和类中分别定义它,就像一样

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

我怎样才能使这个大小写不敏感?

如何使字典不区分大小写

您提到您在您的类中定义它,如:

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

链接:

  • C#:C#6.0如何简化、澄清和浓缩代码

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

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

然后在你的界面上你会做

CaseInsensitiveDictionary<YourClass> { get; }

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

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

如果不区分大小写是合同的一部分,那么听起来你真正想做的是将这个逻辑封装在其他东西中,然后在接口上公开它。

根据你试图公开的特定功能,像这样简单的东西可能会奏效:

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

通过这样的接口公开公开一个集合对我来说似乎有点奇怪(这感觉应该是一个内部实现细节……但这取决于上下文-考虑一下你的封装是否需要工作),但这是我能想到的最接近你试图实现的目标。