C# 如何使字典不区分大小写

C# 如何使字典不区分大小写,c#,C#,我试图使字典不区分大小写。 但是,我声明它是一个属性,我如何才能使它不敏感 我知道在定义时,我可以像这样使用它: var dict = new Dictionary<string, YourClass>( StringComparer.InvariantCultureIgnoreCase); var dict=新字典( StringComparer.InvariantCultureInogoreCase); 但是,我分别在我的接口和类中定义它,如下所示 IDict

我试图使字典不区分大小写。 但是,我声明它是一个属性,我如何才能使它不敏感

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

var dict = new Dictionary<string, YourClass>(
        StringComparer.InvariantCultureIgnoreCase);
var dict=新字典(
StringComparer.InvariantCultureInogoreCase);
但是,我分别在我的接口和类中定义它,如下所示

IDictionary<string, string> dict { get; }
public Dictionary<string, string> dict { get; set; }
IDictionary dict{get;}
公共字典dict{get;set;}

我怎样才能使这个不区分大小写?

你不能。比较器是只读属性()。在构建对象期间声明比较器


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

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

public Dictionary<string, string> dict { get; set; }
公共字典dict{get;set;}
因此,不要对自动属性使用缩写形式,而是使用完整形式:

Dictionary<string, string> _dict = new Dictionary<string, string>(
    StringComparer.InvariantCultureIgnoreCase);
public Dictionary<string, string> dict
{
    get { return _dict; }
    set { _dict = value; }
}
Dictionary\u dict=新字典(
StringComparer.InvariantCultureInogoreCase);
公共词典词典
{
获取{return\u dict;}
设置{u dict=value;}
}
如果您使用的是C#6.0,您甚至可以使用新的自动属性初始值设定项语法编写它:

public Dictionary<string, string> dict { get; set; } = new Dictionary<string, string>(
    StringComparer.InvariantCultureIgnoreCase);
公共字典dict{get;set;}=新字典(
StringComparer.InvariantCultureInogoreCase);
链接:


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

public class CaseInsensitiveDictionary<TValue> : Dictionary<string, TValue>
{
    public CaseInsensitiveDictionary() : base(StringComparer.InvariantCultureIgnoreCase)
    {
    }
}
公共类案例不敏感医学:字典
{
public caseinsensitivedicationary():base(StringComparer.InvariantCultureInogoreCase)
{
}
}
然后在您的界面中

CaseInsensitiveDictionary<YourClass> { get; }
CaseInsensitiveDictionary{get;}

如果不区分大小写是合同的一部分,那么听起来您真正想要做的是将此逻辑封装到其他内容中,然后在接口上公开它

根据您试图公开的特定功能,像这样简单的操作可能会奏效:

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; }
}
公共类案例不敏感索引
{
专用只读词典_集合=
新字典();
公共对象[字符串索引]
{
获取{return _集合[index.ToLower()];}
设置{u集合[index.ToLower()]=value;}
}
}
公共接口IHASASEInsitiveIndex
{
不区分大小写索引{get;}
}

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

将其封装在一个类中,并在访问它之前调用键上的
ToLower
:)您在哪里实例化词典?这就是你要做的。这些评论没有解决接口问题,但其中一个答案解决了。这回答了你的问题吗?但在界面,我不能这样做我不确定我是否理解这个问题。接口只是实现它的类提供的公共功能的一些描述。那么,当您使用接口时,是您的类实现了它吗?如果是这样,则在类中创建字典,您不必在接口中再次创建字典。如果您希望强制实现接口的任何类的属性不区分大小写,您可以创建继承类,如@Scott Chamberlain在其回答中所建议的。但是,这会强制将关联的类更改为使用新的不区分大小写的字典类型。如果您的问题与如何声明字典有关,则这将起作用。如果您想在运行时根据某些条件任意更改词典的大小写敏感度,那么如果不自己实现很多事情,您将无法做到这一点。