Es gibt keine Möglichkeit, a StringCompareran dem Punkt anzugeben, an dem Sie versuchen, einen Wert zu erhalten. Wenn Sie darüber nachdenken "foo".GetHashCode()und "FOO".GetHashCode()völlig anders sind, gibt es keine vernünftige Möglichkeit, einen auf Groß- und Kleinschreibung nicht berücksichtigten Zugriff auf eine Hash-Map mit Groß- und Kleinschreibung zu implementieren.
Sie können jedoch zunächst ein Wörterbuch ohne Berücksichtigung der Groß- und Kleinschreibung erstellen, indem Sie:
var comparer = StringComparer.OrdinalIgnoreCase;
var caseInsensitiveDictionary = new Dictionary<string, int>(comparer);
Oder erstellen Sie ein neues Wörterbuch ohne Berücksichtigung der Groß- und Kleinschreibung mit dem Inhalt eines vorhandenen Wörterbuchs ohne Berücksichtigung der Groß- und Kleinschreibung (wenn Sie sicher sind, dass keine Kollisionen zwischen Groß- und Kleinschreibung vorliegen): -
var oldDictionary = ...;
var comparer = StringComparer.OrdinalIgnoreCase;
var newDictionary = new Dictionary<string, int>(oldDictionary, comparer);
Dieses neue Wörterbuch verwendet dann die GetHashCode()Implementierung auf StringComparer.OrdinalIgnoreCaseso comparer.GetHashCode("foo")und comparer.GetHashcode("FOO")gibt Ihnen den gleichen Wert.
Wenn das Wörterbuch nur wenige Elemente enthält und / oder Sie nur ein- oder zweimal nachschlagen müssen, können Sie das ursprüngliche Wörterbuch als IEnumerable<KeyValuePair<TKey, TValue>>und behandeln und es einfach durchlaufen: -
var myKey = ...;
var myDictionary = ...;
var comparer = StringComparer.OrdinalIgnoreCase;
var value = myDictionary.FirstOrDefault(x => String.Equals(x.Key, myKey, comparer)).Value;
Oder wenn Sie es vorziehen, ohne den LINQ: -
var myKey = ...;
var myDictionary = ...;
var comparer = StringComparer.OrdinalIgnoreCase;
int? value;
foreach (var element in myDictionary)
{
if (String.Equals(element.Key, myKey, comparer))
{
value = element.Value;
break;
}
}
Dies erspart Ihnen die Kosten für die Erstellung einer neuen Datenstruktur. Im Gegenzug betragen die Kosten für eine Suche jedoch O (n) anstelle von O (1).