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 Guid
Schlü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?
c#
dictionary
case-insensitive
MoSlo
quelle
quelle
StringComparer.InvariantCultureIgnoreCase
. Dieser Vergleich ist langsam, da er Zeichenfolgen mit Zeichenklassen vergleicht, um interkulturelle Unterschiede zu überwinden. Dies bedeutet, dass das WortStraße
als gleich behandelt wirdStrasse
und 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 verwendenStringComparer.OrdinalIgnoreCase
. Der Ordnungsvergleicher ist der schnellste Zeichenfolgenvergleicher, den das .NET Framework bieten kann.Antworten:
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.OrdinalIgnoreCase
was effizienter ist, wenn ich einfach den Fall von Zeichen ignorieren möchte. Dies ist jedoch für mich völlig unbegründet, so YMMV.quelle
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; } }
quelle