ConcurrentDictionary<TKey,TValue>.GetOrAdd Metoda
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Přidá pár klíč/hodnota do páru ConcurrentDictionary<TKey,TValue> , pokud klíč ještě neexistuje. Vrátí novou hodnotu nebo existující hodnotu, pokud klíč již existuje.
Přetížení
| Name | Description |
|---|---|
| GetOrAdd(TKey, Func<TKey,TValue>) |
Přidá pár klíč/hodnota do ConcurrentDictionary<TKey,TValue> zadané funkce, pokud klíč ještě neexistuje. Vrátí novou hodnotu nebo existující hodnotu, pokud klíč existuje. |
| GetOrAdd(TKey, TValue) |
Přidá pár klíč/hodnota do páru ConcurrentDictionary<TKey,TValue> , pokud klíč ještě neexistuje. Vrátí novou hodnotu nebo existující hodnotu, pokud klíč existuje. |
| GetOrAdd<TArg>(TKey, Func<TKey,TArg,TValue>, TArg) |
Přidá pár klíč/hodnota do ConcurrentDictionary<TKey,TValue> zadané funkce a argumentu, pokud klíč ještě neexistuje, nebo vrátí existující hodnotu, pokud klíč existuje. |
Příklady
Následující příklad ukazuje, jak volat metodu GetOrAdd :
class CD_GetOrAddOrUpdate
{
// Demonstrates:
// ConcurrentDictionary<TKey, TValue>.AddOrUpdate()
// ConcurrentDictionary<TKey, TValue>.GetOrAdd()
// ConcurrentDictionary<TKey, TValue>[]
static void Main()
{
// Construct a ConcurrentDictionary
ConcurrentDictionary<int, int> cd = new ConcurrentDictionary<int, int>();
// Bombard the ConcurrentDictionary with 10000 competing AddOrUpdates
Parallel.For(0, 10000, i =>
{
// Initial call will set cd[1] = 1.
// Ensuing calls will set cd[1] = cd[1] + 1
cd.AddOrUpdate(1, 1, (key, oldValue) => oldValue + 1);
});
Console.WriteLine("After 10000 AddOrUpdates, cd[1] = {0}, should be 10000", cd[1]);
// Should return 100, as key 2 is not yet in the dictionary
int value = cd.GetOrAdd(2, (key) => 100);
Console.WriteLine("After initial GetOrAdd, cd[2] = {0} (should be 100)", value);
// Should return 100, as key 2 is already set to that value
value = cd.GetOrAdd(2, 10000);
Console.WriteLine("After second GetOrAdd, cd[2] = {0} (should be 100)", value);
}
}
// Demonstrates:
// ConcurrentDictionary<TKey, TValue>.AddOrUpdate()
// ConcurrentDictionary<TKey, TValue>.GetOrAdd()
// ConcurrentDictionary<TKey, TValue>[]
// Construct a ConcurrentDictionary
let cd = ConcurrentDictionary<int, int>()
// Bombard the ConcurrentDictionary with 10000 competing AddOrUpdates
Parallel.For(
0,
10000,
fun i ->
// Initial call will set cd[1] = 1.
// Ensuing calls will set cd[1] = cd[1] + 1
cd.AddOrUpdate(1, 1, (fun key oldValue -> oldValue + 1)) |> ignore
)
|> ignore
printfn $"After 10000 AddOrUpdates, cd[1] = {cd[1]}, should be 10000"
// Should return 100, as key 2 is not yet in the dictionary
let value = cd.GetOrAdd(2, (fun key -> 100))
printfn $"After initial GetOrAdd, cd[2] = {value} (should be 100)"
// Should return 100, as key 2 is already set to that value2
let value2 = cd.GetOrAdd(2, 10000)
printfn $"After second GetOrAdd, cd[2] = {value2} (should be 100)"
' Imports System.Collections.Concurrent
' Imports System.Threading.Tasks
Class CD_GetOrAddOrUpdate
' Demonstrates:
' ConcurrentDictionary<TKey, TValue>.AddOrUpdate()
' ConcurrentDictionary<TKey, TValue>.GetOrAdd()
' ConcurrentDictionary<TKey, TValue>[]
Shared Sub Main()
' Construct a ConcurrentDictionary
Dim cd As New ConcurrentDictionary(Of Integer, Integer)()
' Bombard the ConcurrentDictionary with 10000 competing AddOrUpdates
Parallel.For(0, 10000,
Sub(i)
' Initial call will set cd[1] = 1.
' Ensuing calls will set cd[1] = cd[1] + 1
cd.AddOrUpdate(1, 1, Function(key, oldValue) oldValue + 1)
End Sub)
Console.WriteLine("After 10000 AddOrUpdates, cd[1] = {0}, should be 10000", cd(1))
' Should return 100, as key 2 is not yet in the dictionary
Dim value As Integer = cd.GetOrAdd(2, Function(key) 100)
Console.WriteLine("After initial GetOrAdd, cd[2] = {0} (should be 100)", value)
' Should return 100, as key 2 is already set to that value
value = cd.GetOrAdd(2, 10000)
Console.WriteLine("After second GetOrAdd, cd[2] = {0} (should be 100)", value)
End Sub
End Class
GetOrAdd(TKey, Func<TKey,TValue>)
- Zdroj:
- ConcurrentDictionary.cs
- Zdroj:
- ConcurrentDictionary.cs
- Zdroj:
- ConcurrentDictionary.cs
- Zdroj:
- ConcurrentDictionary.cs
- Zdroj:
- ConcurrentDictionary.cs
Přidá pár klíč/hodnota do ConcurrentDictionary<TKey,TValue> zadané funkce, pokud klíč ještě neexistuje. Vrátí novou hodnotu nebo existující hodnotu, pokud klíč existuje.
public:
TValue GetOrAdd(TKey key, Func<TKey, TValue> ^ valueFactory);
public TValue GetOrAdd(TKey key, Func<TKey,TValue> valueFactory);
member this.GetOrAdd : 'Key * Func<'Key, 'Value> -> 'Value
Public Function GetOrAdd (key As TKey, valueFactory As Func(Of TKey, TValue)) As TValue
Parametry
- key
- TKey
Klíč elementu, který chcete přidat.
- valueFactory
- Func<TKey,TValue>
Funkce použitá k vygenerování hodnoty pro klíč.
Návraty
Hodnota klíče. Toto bude buď existující hodnota klíče, pokud je klíč již ve slovníku, nebo nová hodnota, pokud klíč nebyl ve slovníku.
Výjimky
key nebo valueFactory je null.
Slovník obsahuje příliš mnoho prvků.
Poznámky
Pro úpravy a operace zápisu do slovníku ConcurrentDictionary<TKey,TValue> používá jemně odstupňované uzamykání k zajištění bezpečnosti vlákna. (Operace čtení ve slovníku se provádějí bez zámku.) Delegát je valueFactory však volána mimo zámky, aby se zabránilo problémům, které mohou vzniknout při spouštění neznámého kódu pod zámkem.
GetOrAdd Proto není atomický s ohledem na všechny ostatní operace třídyConcurrentDictionary<TKey,TValue>.
Vzhledem k tomu, že klíč/hodnota může být vložena jiným vláknem při valueFactory generování hodnoty, nemůžete důvěřovat tomu, že právě proto, že valueFactory je proveden, jeho produkovaná hodnota bude vložena do slovníku a vrácena. Pokud voláte GetOrAdd současně v různých vláknech, valueFactory může se volat vícekrát, ale do slovníku se přidá pouze jeden pár klíč/hodnota.
Vrácená hodnota závisí na přítomnosti klíče ve slovníku a na tom, jestli je klíč/hodnota vložena jiným vláknem po GetOrAdd zavolání, ale před valueFactory vygenerováním hodnoty:
| Scenario | Návratová hodnota |
|---|---|
| Klíč je již ve slovníku. | Vrátí se existující hodnota. |
Klíč není ve slovníku.
valueFactory vygeneruje hodnotu. Při opětovném kontrolu klíče se nenajde žádný klíč. |
Klíč/hodnota se vloží do slovníku a vrátí se hodnota. |
Klíč není ve slovníku.
valueFactory vygeneruje hodnotu. Při valueFactory generování hodnoty vloží jiné vlákno hodnotu klíče. Po valueFactory spuštění a opětovném kontrolu klíče se klíč vložený jiným vláknem najde. |
Vrátí se hodnota vložená jiným vláknem. |
Viz také
Platí pro
GetOrAdd(TKey, TValue)
- Zdroj:
- ConcurrentDictionary.cs
- Zdroj:
- ConcurrentDictionary.cs
- Zdroj:
- ConcurrentDictionary.cs
- Zdroj:
- ConcurrentDictionary.cs
- Zdroj:
- ConcurrentDictionary.cs
Přidá pár klíč/hodnota do páru ConcurrentDictionary<TKey,TValue> , pokud klíč ještě neexistuje. Vrátí novou hodnotu nebo existující hodnotu, pokud klíč existuje.
public:
TValue GetOrAdd(TKey key, TValue value);
public TValue GetOrAdd(TKey key, TValue value);
member this.GetOrAdd : 'Key * 'Value -> 'Value
Public Function GetOrAdd (key As TKey, value As TValue) As TValue
Parametry
- key
- TKey
Klíč elementu, který chcete přidat.
- value
- TValue
Hodnota, která se má přidat, pokud klíč ještě neexistuje.
Návraty
Hodnota klíče. Toto bude buď existující hodnota klíče, pokud je klíč již ve slovníku, nebo nová hodnota, pokud klíč nebyl ve slovníku.
Výjimky
key je null.
Slovník obsahuje příliš mnoho prvků.
Viz také
Platí pro
GetOrAdd<TArg>(TKey, Func<TKey,TArg,TValue>, TArg)
- Zdroj:
- ConcurrentDictionary.cs
- Zdroj:
- ConcurrentDictionary.cs
- Zdroj:
- ConcurrentDictionary.cs
- Zdroj:
- ConcurrentDictionary.cs
- Zdroj:
- ConcurrentDictionary.cs
Přidá pár klíč/hodnota do ConcurrentDictionary<TKey,TValue> zadané funkce a argumentu, pokud klíč ještě neexistuje, nebo vrátí existující hodnotu, pokud klíč existuje.
public:
generic <typename TArg>
TValue GetOrAdd(TKey key, Func<TKey, TArg, TValue> ^ valueFactory, TArg factoryArgument);
public TValue GetOrAdd<TArg>(TKey key, Func<TKey,TArg,TValue> valueFactory, TArg factoryArgument) where TArg : allows ref struct;
public TValue GetOrAdd<TArg>(TKey key, Func<TKey,TArg,TValue> valueFactory, TArg factoryArgument);
member this.GetOrAdd : 'Key * Func<'Key, 'Arg, 'Value> * 'Arg -> 'Value
Public Function GetOrAdd(Of TArg) (key As TKey, valueFactory As Func(Of TKey, TArg, TValue), factoryArgument As TArg) As TValue
Parametry typu
- TArg
Typ argumentu, který valueFactoryse má předat .
Parametry
- key
- TKey
Klíč elementu, který chcete přidat.
- valueFactory
- Func<TKey,TArg,TValue>
Funkce použitá k vygenerování hodnoty pro klíč.
- factoryArgument
- TArg
Hodnota argumentu, která valueFactoryse má předat .
Návraty
Hodnota klíče. Toto bude buď existující hodnota klíče, pokud je klíč již ve slovníku, nebo nová hodnota, pokud klíč nebyl ve slovníku.
Výjimky
key je odkaz null (nic v Visual Basic).
Slovník obsahuje příliš mnoho prvků.
Poznámky
Pro úpravy a operace zápisu do slovníku ConcurrentDictionary<TKey,TValue> používá jemně odstupňované uzamykání k zajištění bezpečnosti vlákna. (Operace čtení ve slovníku se provádějí bez zámku.) Delegát je valueFactory však volána mimo zámky, aby se zabránilo problémům, které mohou vzniknout při spouštění neznámého kódu pod zámkem.
GetOrAdd Proto není atomický s ohledem na všechny ostatní operace třídyConcurrentDictionary<TKey,TValue>.
Vzhledem k tomu, že klíč/hodnota může být vložena jiným vláknem při valueFactory generování hodnoty, nemůžete důvěřovat tomu, že právě proto, že valueFactory je proveden, jeho produkovaná hodnota bude vložena do slovníku a vrácena. Pokud voláte GetOrAdd současně v různých vláknech, valueFactory může se volat vícekrát, ale do slovníku se přidá pouze jeden pár klíč/hodnota.
Vrácená hodnota závisí na přítomnosti klíče ve slovníku a na tom, jestli je klíč/hodnota vložena jiným vláknem po GetOrAdd zavolání, ale před valueFactory vygenerováním hodnoty:
| Scenario | Návratová hodnota |
|---|---|
| Klíč je již ve slovníku. | Vrátí se existující hodnota. |
Klíč není ve slovníku.
valueFactory vygeneruje hodnotu. Při opětovném kontrolu klíče se nenajde žádný klíč. |
Klíč/hodnota se vloží do slovníku a vrátí se hodnota. |
Klíč není ve slovníku.
valueFactory vygeneruje hodnotu. Při valueFactory generování hodnoty vloží jiné vlákno hodnotu klíče. Po valueFactory spuštění a opětovném kontrolu klíče se klíč vložený jiným vláknem najde. |
Vrátí se hodnota vložená jiným vláknem. |