我有一個區分大小寫的字典(非常大)。我想使用忽略大小寫(不區分大小寫)來搜索此字典的鍵。 我不想使用foreach遍歷這個字典並比較每個值,因爲字典包含太多的數據。用大小寫敏感的字典搜索大小寫使用c#
是否有更好的(最有效的)方式來使用C#來做到這一點?我想要一些建議。
我有一個區分大小寫的字典(非常大)。我想使用忽略大小寫(不區分大小寫)來搜索此字典的鍵。 我不想使用foreach遍歷這個字典並比較每個值,因爲字典包含太多的數據。用大小寫敏感的字典搜索大小寫使用c#
是否有更好的(最有效的)方式來使用C#來做到這一點?我想要一些建議。
所以,如果我理解正確的話,你要保存的字符串,因爲他們,但在不區分大小寫的方式散列字典,這樣你可以在O還是搜索(1)攤銷時不區分大小寫?
我看到它的方式,你需要在創建Dictionary
與this 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」)。
會變成是區分大小寫的字典爲不區分大小寫的一個 –
@Rune FS:對於散列是的,因爲否則你不能就能夠做到在搜索不區分大小寫的方式。但是字符串本身仍然保持與他們的原始字符。至少這是我明白他想要的。 – Tudor
參見字符串比較筆記這裏http://stackoverflow.com/questions/9033/hidden-features-of-c/12137#12137這裏http://stackoverflow.com/questions/2801508/what-is-wrong -with-tolowerinvariant –
都鐸王朝的答案是一個很好的答案,我想補充它,要求您使用StringComparer.CurrentCultureIgnoreCase
而不是創建自己的比較類(特別是如果預期結果相同)。
例子:
Dictionary<string, string> openWith =
new Dictionary<string, string>(
StringComparer.CurrentCultureIgnoreCase);
你可以考慮用string.Compare LINQ查詢( 「A」, 「A」,StringComparison.CurrentCultureIgnoreCase)是一個「循環「?然而 –