2016-07-27 43 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; } 
} 

這似乎有點奇怪我是通過公開像一個接口暴露的集合這個(這感覺應該是一個內部的實現細節......但這取決於上下文 - 考慮你的封裝是否需要工作),但這與你想要達到的我想得最接近。