Udostępnij za pośrednictwem


ConcurrentDictionary<TKey,TValue>.GetOrAdd Metoda

Definicja

Dodaje parę klucz/wartość do ConcurrentDictionary<TKey,TValue> elementu , jeśli klucz jeszcze nie istnieje. Zwraca nową wartość lub istniejącą wartość, jeśli klucz już istnieje.

Przeciążenia

GetOrAdd(TKey, Func<TKey,TValue>)

Dodaje parę klucz/wartość do ConcurrentDictionary<TKey,TValue> elementu przy użyciu określonej funkcji, jeśli klucz jeszcze nie istnieje. Zwraca nową wartość lub istniejącą wartość, jeśli klucz istnieje.

GetOrAdd(TKey, TValue)

Dodaje parę klucz/wartość do ConcurrentDictionary<TKey,TValue> elementu , jeśli klucz jeszcze nie istnieje. Zwraca nową wartość lub istniejącą wartość, jeśli klucz istnieje.

GetOrAdd<TArg>(TKey, Func<TKey,TArg,TValue>, TArg)

Dodaje parę klucz/wartość do ConcurrentDictionary<TKey,TValue> klasy przy użyciu określonej funkcji i argumentu, jeśli klucz jeszcze nie istnieje, lub zwraca istniejącą wartość, jeśli klucz istnieje.

Przykłady

W poniższym przykładzie pokazano, jak wywołać metodę 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>)

Źródło:
ConcurrentDictionary.cs
Źródło:
ConcurrentDictionary.cs
Źródło:
ConcurrentDictionary.cs

Dodaje parę klucz/wartość do ConcurrentDictionary<TKey,TValue> elementu przy użyciu określonej funkcji, jeśli klucz jeszcze nie istnieje. Zwraca nową wartość lub istniejącą wartość, jeśli klucz istnieje.

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

Klucz elementu do dodania.

valueFactory
Func<TKey,TValue>

Funkcja używana do generowania wartości klucza.

Zwraca

TValue

Wartość klucza. Będzie to istniejąca wartość klucza, jeśli klucz znajduje się już w słowniku, lub nową wartość, jeśli klucz nie znajdował się w słowniku.

Wyjątki

key lub valueFactory to null.

Słownik zawiera zbyt wiele elementów.

Uwagi

W przypadku modyfikacji i operacji zapisu w słowniku używa precyzyjnego blokowania w ConcurrentDictionary<TKey,TValue> celu zapewnienia bezpieczeństwa wątków. (Operacje odczytu w słowniku są wykonywane w sposób wolny od blokady). Jednak delegat jest wywoływany poza blokadami, valueFactory aby uniknąć problemów, które mogą wystąpić podczas wykonywania nieznanego kodu pod blokadą. GetOrAdd W związku z tym nie jest niepodzielna w odniesieniu do wszystkich innych operacji w ConcurrentDictionary<TKey,TValue> klasie.

Ponieważ klucz/wartość można wstawić przez inny wątek podczas valueFactory generowania wartości, nie można ufać, że tylko dlatego valueFactory , że wykonane, jego wygenerowana wartość zostanie wstawiona do słownika i zwrócona. Jeśli wywołasz jednocześnie GetOrAdd różne wątki, może być wywoływana wiele razy, valueFactory ale do słownika zostanie dodana tylko jedna para klucz/wartość.

Wartość zwracana zależy od obecności klucza w słowniku i tego, czy klucz/wartość jest wstawiany przez inny wątek po GetOrAdd wywołaniu, ale przed valueFactory wygenerowaniem wartości:

Scenariusz Wartość zwracana
Klucz znajduje się już w słowniku. Zwracana jest istniejąca wartość.
Klucz nie znajduje się w słowniku. valueFactory generuje wartość. Po ponownym zaznaczeniu klucza nie znaleziono klucza. Klucz/wartość jest wstawiany do słownika, a wartość jest zwracana.
Klucz nie znajduje się w słowniku. valueFactory generuje wartość. Podczas valueFactory generowania wartości inny wątek wstawia wartość klucza. Po valueFactory wykonaniu i ponownym zaznaczeniu klucza zostanie znaleziony klucz wstawiony przez inny wątek. Zwracana jest wartość wstawiona przez inny wątek.

Zobacz też

Dotyczy

GetOrAdd(TKey, TValue)

Źródło:
ConcurrentDictionary.cs
Źródło:
ConcurrentDictionary.cs
Źródło:
ConcurrentDictionary.cs

Dodaje parę klucz/wartość do ConcurrentDictionary<TKey,TValue> elementu , jeśli klucz jeszcze nie istnieje. Zwraca nową wartość lub istniejącą wartość, jeśli klucz istnieje.

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

Klucz elementu do dodania.

value
TValue

Wartość do dodania, jeśli klucz jeszcze nie istnieje.

Zwraca

TValue

Wartość klucza. Będzie to istniejąca wartość klucza, jeśli klucz znajduje się już w słowniku, lub nową wartość, jeśli klucz nie znajdował się w słowniku.

Wyjątki

key to null.

Słownik zawiera zbyt wiele elementów.

Zobacz też

Dotyczy

GetOrAdd<TArg>(TKey, Func<TKey,TArg,TValue>, TArg)

Źródło:
ConcurrentDictionary.cs
Źródło:
ConcurrentDictionary.cs
Źródło:
ConcurrentDictionary.cs

Dodaje parę klucz/wartość do ConcurrentDictionary<TKey,TValue> klasy przy użyciu określonej funkcji i argumentu, jeśli klucz jeszcze nie istnieje, lub zwraca istniejącą wartość, jeśli klucz istnieje.

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);
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, który ma być przekazywany do valueFactoryelementu .

Parametry

key
TKey

Klucz elementu do dodania.

valueFactory
Func<TKey,TArg,TValue>

Funkcja używana do generowania wartości klucza.

factoryArgument
TArg

Wartość argumentu, która ma być przekazywana do valueFactoryelementu .

Zwraca

TValue

Wartość klucza. Będzie to istniejąca wartość klucza, jeśli klucz znajduje się już w słowniku, lub nową wartość, jeśli klucz nie znajdował się w słowniku.

Wyjątki

key jest odwołaniem null (Nic w Visual Basic).

Słownik zawiera zbyt wiele elementów.

Uwagi

W przypadku modyfikacji i operacji zapisu w słowniku używa precyzyjnego blokowania w ConcurrentDictionary<TKey,TValue> celu zapewnienia bezpieczeństwa wątków. (Operacje odczytu w słowniku są wykonywane w sposób wolny od blokady). Jednak delegat jest wywoływany poza blokadami, valueFactory aby uniknąć problemów, które mogą wystąpić podczas wykonywania nieznanego kodu pod blokadą. GetOrAdd W związku z tym nie jest niepodzielna w odniesieniu do wszystkich innych operacji w ConcurrentDictionary<TKey,TValue> klasie.

Ponieważ klucz/wartość można wstawić przez inny wątek podczas valueFactory generowania wartości, nie można ufać, że tylko dlatego valueFactory , że wykonane, jego wygenerowana wartość zostanie wstawiona do słownika i zwrócona. Jeśli wywołasz jednocześnie GetOrAdd różne wątki, może być wywoływana wiele razy, valueFactory ale do słownika zostanie dodana tylko jedna para klucz/wartość.

Wartość zwracana zależy od obecności klucza w słowniku i tego, czy klucz/wartość jest wstawiany przez inny wątek po GetOrAdd wywołaniu, ale przed valueFactory wygenerowaniem wartości:

Scenariusz Wartość zwracana
Klucz znajduje się już w słowniku. Zwracana jest istniejąca wartość.
Klucz nie znajduje się w słowniku. valueFactory generuje wartość. Po ponownym zaznaczeniu klucza nie znaleziono klucza. Klucz/wartość jest wstawiany do słownika, a wartość jest zwracana.
Klucz nie znajduje się w słowniku. valueFactory generuje wartość. Podczas valueFactory generowania wartości inny wątek wstawia wartość klucza. Po valueFactory wykonaniu i ponownym zaznaczeniu klucza zostanie znaleziony klucz wstawiony przez inny wątek. Zwracana jest wartość wstawiona przez inny wątek.

Dotyczy