I have an application that use managed dlls. One of those dlls return a generic dictionary:
Dictionary<string, int> MyDictionary;
The dictionary contains keys with upper and lower case.
On another side I am getting a list of potential keys (string) however I cannot guarantee the case. I am trying to get the value in the dictionary using the keys. But of course the following will fail since I have a case mismatch:
bool Success = MyDictionary.TryGetValue( MyIndex, out TheValue );
I was hoping the TryGetValue would have an ignore case flag like mentioned in the MSDN doc, but it seems this is not valid for generic dictionaries.
Is there a way to get the value of that dictionary ignoring the key case?
Is there a better workaround than creating a new copy of the dictionary with the proper StringComparer.OrdinalIgnoreCase parameter?
Best Answer
There's no way to specify a
StringComparer
at the point where you try to get a value. If you think about it,"foo".GetHashCode()
and"FOO".GetHashCode()
are totally different so there's no reasonable way you could implement a case-insensitive get on a case-sensitive hash map.You can, however, create a case-insensitive dictionary in the first place using:-
Or create a new case-insensitive dictionary with the contents of an existing case-sensitive dictionary (if you're sure there are no case collisions):-
This new dictionary then uses the
GetHashCode()
implementation onStringComparer.OrdinalIgnoreCase
socomparer.GetHashCode("foo")
andcomparer.GetHashcode("FOO")
give you the same value.Alternately, if there are only a few elements in the dictionary, and/or you only need to lookup once or twice, you can treat the original dictionary as an
IEnumerable<KeyValuePair<TKey, TValue>>
and just iterate over it:-Or if you prefer, without the LINQ:-
This saves you the cost of creating a new data structure, but in return the cost of a lookup is O(n) instead of O(1).