2016-07-27 22 views
2

我正在尝试使字典不区分大小写。 但是,我宣布它是一个属性,我怎么能使这个不敏感。如何使字典不区分大小写

我知道,当定义,我可以用它喜欢:

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

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

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

我怎样才能让这种情况下不区分大小写?

+3

将它包装在一个类中,然后在访问它之前调用密钥上的'ToLower': –

+5

你在哪里实例化你的字典?那就是你要做的地方。 – itsme86

+0

这些评论没有解决接口问题,但答案之一。 –

回答

2

你提到你在你的类中定义它像:

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

个链接:

+0

但在界面,我不能这样做 –

+0

我不知道我理解这个问题。接口只是对实现它的类提供的公共功能的一些描述。所以,当你使用接口时,它是否实现了它的类?如果是这样,字典将在该类中创建,您不必在界面中再次创建该字典。 –

+0

如果您希望强制该属性对实现您的接口的任何类不区分大小写,您可以创建一个继承的类,如@Scott Chamberlain在其答案中所建议的。但是,这会强制关联的类更改为使用新的不区分大小写的字典类型。 –

2

,你可以执行它的类或接口级别的唯一方法是你犯了一个新的派生类型和使用该类型。

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

然后在你的界面,你会怎么做

CaseInsensitiveDictionary<YourClass> { get; } 
+0

如果你的问题与你如何声明你的字典有关,这将工作。如果您希望能够根据某些标准随意更改字典在运行时区分大小写的敏感性,那么如果没有自行实施很多事情,就无法做到这一点。 –

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

这似乎有点奇怪我是通过公开像一个接口暴露的集合这个(这感觉应该是一个内部的实现细节......但这取决于上下文 - 考虑你的封装是否需要工作),但这与你想要达到的我想得最接近。