Ontwikkelomgeving: .NET 4.0 of hoger
Opmerking: De System.Collections.Concurrent naamruimte binnen .NET Framework 4. Zoals in de MSDN-documentatie implementeert ConcurrentDictionary een thread-safe collectie die door meerdere threads tegelijk toegankelijk kan worden. ConcurrentDictionary implementeert IDictionary<TKey, TValue> en heeft enkele unieke mechanismen voor het toevoegen en bijwerken van sleutel/waarde. (Hieronder volgt een uitleg van wanneer en welke methode te gebruiken)
Scenario 1: Voeg een nieuw item toe, alleen als de sleutel niet in het woordenboek bestaat... Gebruik TryAdd. TryAdd accepteert de sleutel en waarde die aan het woordenboek zijn toegevoegd, geeft fasle terug als de sleutel niet in het woordenboek bestaat; Geeft waar terug als aanwezig. publieke bool TryAdd (TKey key, TValue waarde)
Situatie 2: Werk de bestaande sleutel bij in de Waarde van het woordenboek... Gebruik TryUpdate. Als het woordenboek deze sleutel heeft en een voorwaardelijke update geeft, zou het in deze methode een vergelijkingswaarde moeten geven die kan worden bijgewerkt wanneer de huidige waarde gelijk is aan de vergelijkingswaarde (TValue comparisonValue). publieke bool TryUpdate(TKey key, TValue newValue, TValue comparisonValue)
Situatie 3: Er moet een sleutel/waarde aan het woordenboek worden toegevoegd; Als de sleutel niet zeker is of deze in het woordenboek bestaat; Als het bestaat, update Als het niet bestaat, voeg het toe...
Gebruik AddOrUpdate. AddOrUpdate heeft twee overloads, en deze twee overloads geven de waarde van de waarde terug: De eerste overbelaste parameter is AddOrUpdate(TKey, Func<TKey, TValue>, Func<TKey, TValue, TValue>) De parameters zijn Key en twee afgevaardigden; Het doel van de eerste delegate is om te delegeren wanneer de sleutel niet bestaat en de waarde (beginwaarde) terug te geven. Deze delegatiefunc geeft < beginwaarde terug, key>. De tweede delegate Func < geeft Value, key, oldValue> en voert de eerste delegate uit als de sleutel niet in het woordenboek bestaat (als hij bestaat, draait hij niet; Het doel is om de waarde de beginwaarde te geven), en vervolgens zal het de waarde (de beginwaarde van de waarde) teruggeven; De tweede delegatie is een methode om de waardewaarde te wijzigen, wat ook een retourwaarde vereist (verander de beginwaarde naar de eindwaarde). Func < de > Value, key, oldValue teruggeven publieke TValue AddOrUpdate(TKey, Func<TKey, TValue>, Func<TKey, TValue, TValue>)
2. De parameter van de tweede overload is AddOrUpdate(TKey, TValue, Func<TKey, TValue, TValue>) De eerste parameter is key, de tweede is wanneer de key niet bestaat, deze waarde is de beginwaarde van value, en de derde is delegate is om de wijziging uit te voeren (Func< geeft Value, key, oldValue> terug). publieke TValue AddOrUpdate(TKey, TValue, Func<TKey, TValue, TValue>)
Situatie 4: Voeg de waarde van de sleutel toe aan het woordenboek, maar als de sleutel al bestaat, haal de waarde eruit; Anders wordt het toegevoegd Eerste overload: GetOrAdd(TKEY, Func<TKey, TValue>valueFactory) De eerste parameter is key, de tweede parameter wordt gedelegeerd Func<waarde, key>, wanneer de key niet bestaat, wordt een variabele als key doorgegeven en wordt de waarde gewijzigd. en creëer een sleutel en waarde, die een waardewaarde teruggeven.
2. Tweede Overload: GetOrAdd (TKEY, TValue) De eerste parameter is key, en het doel van de tweede parameter is om een nieuwe waarde te creëren die door de key wordt gegeven wanneer deze niet bestaat. Geeft waarde terug. publieke TValue GetOrAdd(TKEY,Func<TKey, TValue>valueFactory) publieke TValue GetOrAdd(TKEY,TValue)
Elke bewerking van AddOrUpdate en GetOrAdd is een methode die ConcurrentDictionary heeft om het woordenboek aan te passen/schrijven, wat de veiligheid van threads waarborgt (dit gebeurt op een lockless manier, waarbij data in het woordenboek wordt gelezen). |