c # Dictionary: Durch Deklaration des Schlüssels wird von Groß- und Kleinschreibung unterschieden

74

Ich habe ein Dictionary<string, object>Wörterbuch. Früher war es so, Dictionary<Guid, object>aber andere 'Bezeichner' sind ins Spiel gekommen und die Schlüssel werden jetzt als Zeichenfolgen behandelt.

Das Problem ist, dass die GuidSchlüssel aus meinen Quelldaten als kommen VarChar, so dass jetzt ein Schlüssel von "923D81A0-7B71-438d-8160-A524EA7EFA5E"nicht der gleiche ist wie "923d81a0-7b71-438d-8160-a524ea7efa5e"(war kein Problem bei der Verwendung von Guids).

Das wirklich Schöne (und Süße) am .NET Framework ist, dass ich Folgendes tun kann:

Dictionary<string, CustomClass> _recordSet = new Dictionary<string, CustomClass>(
    StringComparer.InvariantCultureIgnoreCase);

Und das funktioniert super. Aber was ist mit einem verschachtelten Wörterbuch? Wie folgt:

Dictionary<int, Dictionary<string, CustomClass>> _customRecordSet 
    = new  Dictionary<int, Dictionary<string, CustomClass>>();

Wie würde ich den Zeichenfolgenvergleicher in einem verschachtelten Wörterbuch wie diesem angeben?

MoSlo
quelle
26
Nur ein Hinweis, vielleicht möchten Sie die Verwendung von überdenken StringComparer.InvariantCultureIgnoreCase. Dieser Vergleich ist langsam, da er Zeichenfolgen mit Zeichenklassen vergleicht, um interkulturelle Unterschiede zu überwinden. Dies bedeutet, dass das Wort Straßeals gleich behandelt wird Strasseund umgekehrt. Ich gehe davon aus, dass Sie ein solches Verhalten nicht möchten und wenn die Leistung entscheidend ist (wenn Sie so etwas wie eine Cache-Schicht über einer Datenbank implementieren), ist es besser, wenn Sie diese verwenden StringComparer.OrdinalIgnoreCase. Der Ordnungsvergleicher ist der schnellste Zeichenfolgenvergleicher, den das .NET Framework bieten kann.
Ivaylo Slavov
3
Mögliches Duplikat des Zugriffs ohne
Berücksichtigung der Groß- und
2
Wirklich @ avs099? Der Beitrag, auf den Sie verlinkt haben, ist ein Jahr jünger als dieser. Hast du es überhaupt bemerkt?
AustinWBryan
3
@AustinWBryan: "Mögliches Duplikat" ist eine Möglichkeit zur Bereinigung - um ähnliche Fragen zu schließen und eine mit den besten Antworten zu behalten. Das Datum ist nicht wesentlich. Siehe Soll ich abstimmen, um eine doppelte Frage zu schließen, obwohl sie viel neuer ist und aktuellere Antworten enthält?
Michael Freidgeim

Antworten:

80

Wenn Sie dem äußeren Wörterbuch ein Element hinzufügen, erstellen Sie wahrscheinlich eine neue Instanz des verschachtelten Wörterbuchs. Fügen Sie es an dieser Stelle hinzu und verwenden Sie dabei den überladenen Konstruktor , der ein Element verwendet IEqualityComparer<TKey>.

_customRecordSet.Add(0, new Dictionary<string, CustomClass>(StringComparer.InvariantCultureIgnoreCase));


Update 08/03/2017: Anekdotisch habe ich irgendwo gelesen (ich denke in "Schreiben von hochleistungsfähigem .NET-Code"), StringComparer.OrdinalIgnoreCasewas effizienter ist, wenn ich einfach den Fall von Zeichen ignorieren möchte. Dies ist jedoch für mich völlig unbegründet, so YMMV.

Adam Houldsworth
quelle
8

Sie müssen die verschachtelten Wörterbücher initialisieren, um sie verwenden zu können. Verwenden Sie einfach den Code, den Sie oben an diesem Punkt haben.

Grundsätzlich sollten Sie einen Code wie diesen haben:

public void insert(int int_key, string guid, CustomClass obj)
{
    if (_customRecordSet.ContainsKey(int_key)
         _customRecordSet[int_key][guid] = obj;
    else
    {
         _customRecordSet[int_key] = new Dictionary<string, CustomClass> 
                                     (StringComparer.InvariantCultureIgnoreCase);
         _customRecordSet[int_key][guid] = obj;
    }
}
Patrick
quelle