Jsou 3 situace: 1) Chci, aby ve slovníku pod nějakým klíčem byla třeba hodnota 5 - je mi jedno, jestli tam pod tím klíčem už něco bylo, nebo ne. Pak napíšu: cd("key") = 5 Mohl bych napsat i tohle, ale je to delší:
Dim hodnota = 5
cd.AddOrUpdate("key", hodnota, Function(k, ov) hodnota)
2) Chci, aby se do slovníku uložila 5, pokud tam nic nebylo, a 10, pokud tam už nějaká hodnota byla. Pak napíšu
Dim hodnota = 10
cd.AddOrUpdate("key", 5, Function(k, ov) hodnota)
3) Chci, aby se do slovníku uložila 5, pokud tam nic nebylo, a pokud tam něco bylo, potřebuji tam dát hodnotu, která závisí na tom, co ve slovníku bylo (např. ta inkrementace, o které jsem psal):
cd.AddOrUpdate("key", 5, Function(k, oldValue)
'zde si vypočítám hodnotu, kterou do slovníku chci uložit, na základě oldValue
End Function)
Funkce AddOrUpdate je takhle udělána kvůli třetímu případu, který je občas potřeba. Btw až teď jsem si uvědomil, že to možná nechápete proto, že netušíte, že lambda funkce podporují closures, tedy že v nich můžete používat proměnné deklarované ve funkcích, které tu lambdu obsahují. Výstupní hodnotu do lambdy tedy dostanete snadno, stačí ji mít v nějaké proměnné. A mimochodem by mě zajímalo, jak byste dělal tu inkrementaci - máte 10 objektů a ke každému si potřebujete při nějaké události thread-safe inkrementovat číslo, a přitom tuto informaci nechcete cpát do těch objektů samých. ConcurrentDictionary a postup, který jsem uvedl předtím, je úplně ideální řešení.
|