2012-06-29 84 views
1

我有一個區分大小寫的字典(非常大)。我想使用忽略大小寫(不區分大小寫)來搜索此字典的鍵。 我不想使用foreach遍歷這個字典並比較每個值,因爲字典包含太多的數據。用大小寫敏感的字典搜索大小寫使用c#

是否有更好的(最有效的)方式來使用C#來做到這一點?我想要一些建議。

+1

你可以考慮用string.Compare LINQ查詢( 「A」, 「A」,StringComparison.CurrentCultureIgnoreCase)是一個「循環「?然而 –

回答

4

所以,如果我理解正確的話,你要保存的字符串,因爲他們,但在不區分大小寫的方式散列字典,這樣你可以在O還是搜索(1)攤銷時不區分大小寫?

我看到它的方式,你需要在創建Dictionarythis constructor時和執行時IEqualityComparer治療字符串,就好像它們是例如全部大寫或小寫和相同的散列碼(即迴歸到通過自定義IEqualityComparer該字符串的哈希碼變爲大寫)。

例如:

class MyComparer : IEqualityComparer<string> 
{ 
    public bool Equals(string x, string y) 
    { 
     return x.ToUpper() == y.ToUpper(); 
    } 

    public int GetHashCode(string obj) 
    { 
     return obj.ToUpper().GetHashCode(); 
    } 
} 

... 

Dictionary<String, String> dict = new Dictionary<string, string>(new MyComparer()); 

現在實際上你的字典持有串正常,但搜索或增加時,它會將它們視爲全部大寫如此「ABCD」被視爲與「ABCD」(均作爲「ABCD」)。

+0

會變成是區分大小寫的字典爲不區分大小寫的一個 –

+0

@Rune FS:對於散列是的,因爲否則你不能就能夠做到在搜索不區分大小寫的方式。但是字符串本身仍然保持與他們的原始字符。至少這是我明白他想要的。 – Tudor

+0

參見字符串比較筆記這裏http://stackoverflow.com/questions/9033/hidden-features-of-c/12137#12137這裏http://stackoverflow.com/questions/2801508/what-is-wrong -with-tolowerinvariant –

2

都鐸王朝的答案是一個很好的答案,我想補充它,要求您使用StringComparer.CurrentCultureIgnoreCase而不是創建自己的比較類(特別是如果預期結果相同)。

例子:

Dictionary<string, string> openWith = 
        new Dictionary<string, string>( 
         StringComparer.CurrentCultureIgnoreCase); 

來源:http://msdn.microsoft.com/en-us/library/ms132072.aspx