ConcurrentDictionary<TKey,TValue>.GetOrAdd ConcurrentDictionary<TKey,TValue>.GetOrAdd ConcurrentDictionary<TKey,TValue>.GetOrAdd ConcurrentDictionary<TKey,TValue>.GetOrAdd Method

Definition

Fügt dem ConcurrentDictionary<TKey,TValue> ein Schlüssel-Wert-Paar hinzu, wenn der Schlüssel nicht bereits vorhanden ist.Adds a key/value pair to the ConcurrentDictionary<TKey,TValue> if the key does not already exist. Gibt den neuen Wert oder den vorhandenen Wert zurück, wenn der Schlüssel bereits existiert.Returns the new value, or the existing value if the key already exists.

Überlädt

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

Fügt dem ConcurrentDictionary<TKey,TValue> ein Schlüssel/Wert-Paar mithilfe der angegebenen Funktion hinzu, wenn der Schlüssel noch nicht vorhanden ist.Adds a key/value pair to the ConcurrentDictionary<TKey,TValue> by using the specified function if the key does not already exist. Gibt den neuen Wert oder den vorhandenen Wert zurück, wenn der Schlüssel existiert.Returns the new value, or the existing value if the key exists.

GetOrAdd(TKey, TValue) GetOrAdd(TKey, TValue) GetOrAdd(TKey, TValue) GetOrAdd(TKey, TValue)

Fügt dem ConcurrentDictionary<TKey,TValue> ein Schlüssel-Wert-Paar hinzu, wenn der Schlüssel nicht bereits vorhanden ist.Adds a key/value pair to the ConcurrentDictionary<TKey,TValue> if the key does not already exist. Gibt den neuen Wert oder den vorhandenen Wert zurück, wenn der Schlüssel existiert.Returns the new value, or the existing value if the key exists.

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

Fügt dem ConcurrentDictionary<TKey,TValue> mithilfe der angegebenen Funktion und eines Arguments ein Schlüssel-Wert-Paar hinzu, wenn der Schlüssel noch nicht vorhanden ist, oder gibt den vorhanden Wert zurück, wenn der Schlüssel vorhanden ist.Adds a key/value pair to the ConcurrentDictionary<TKey,TValue> by using the specified function and an argument if the key does not already exist, or returns the existing value if the key exists.

Beispiele

Im folgenden Beispiel wird gezeigt, wie die GetOrAdd -Methode aufgerufen wird:The following example shows how to call the GetOrAdd method:

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);
    }
}
' 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>) GetOrAdd(TKey, Func<TKey,TValue>) GetOrAdd(TKey, Func<TKey,TValue>) GetOrAdd(TKey, Func<TKey,TValue>)

Fügt dem ConcurrentDictionary<TKey,TValue> ein Schlüssel/Wert-Paar mithilfe der angegebenen Funktion hinzu, wenn der Schlüssel noch nicht vorhanden ist.Adds a key/value pair to the ConcurrentDictionary<TKey,TValue> by using the specified function if the key does not already exist. Gibt den neuen Wert oder den vorhandenen Wert zurück, wenn der Schlüssel existiert.Returns the new value, or the existing value if the key exists.

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

Parameter

key
TKey TKey TKey TKey

Der Schlüssel des hinzuzufügenden Elements.The key of the element to add.

valueFactory
Func<TKey,TValue>

Die Funktion, mit der ein Wert für den Schlüssel generiert wird.The function used to generate a value for the key.

Gibt zurück

TValue TValue TValue TValue

Der Wert für den Schlüssel.The value for the key. Dies ist entweder der vorhandene Wert für den Schlüssel, wenn der Schlüssel bereits im Wörterbuch vorhanden ist, oder der neue Wert, wenn der Schlüssel nicht im Wörterbuch vorhanden war.This will be either the existing value for the key if the key is already in the dictionary, or the new value if the key was not in the dictionary.

Ausnahmen

key oder valueFactory ist null.key or valueFactory is null.

Das Wörterbuch enthält bereits die maximale Anzahl von Elementen (MaxValue).The dictionary already contains the maximum number of elements (MaxValue).

Hinweise

Bei Änderungen und Schreibvorgängen für das Wörter ConcurrentDictionary<TKey,TValue> Buch verwendet differenzierte Sperren, um die Thread Sicherheit sicherzustellen.For modifications and write operations to the dictionary, ConcurrentDictionary<TKey,TValue> uses fine-grained locking to ensure thread safety. (Lesevorgänge für das Wörterbuch werden auf Sperr freie Weise ausgeführt.) Der valueFactory Delegat wird jedoch außerhalb der Sperren aufgerufen, um Probleme zu vermeiden, die durch die Ausführung von unbekanntem Code unter einer Sperre auftreten können.(Read operations on the dictionary are performed in a lock-free manner.) However, the valueFactory delegate is called outside the locks to avoid the problems that can arise from executing unknown code under a lock. Daher ist nicht atomarisch in Bezug auf alle anderen Vorgänge in der ConcurrentDictionary<TKey,TValue> -Klasse. GetOrAddTherefore, GetOrAdd is not atomic with regards to all other operations on the ConcurrentDictionary<TKey,TValue> class.

Da ein Schlüssel/Wert von einem anderen Thread eingefügt werden kann valueFactory , während einen Wert generiert, können Sie sich nicht darauf valueFactory verlassen, dass der erstellte Wert nur, wenn er ausgeführt wurde, in das Wörterbuch eingefügt und zurückgegeben wird.Since a key/value can be inserted by another thread while valueFactory is generating a value, you cannot trust that just because valueFactory executed, its produced value will be inserted into the dictionary and returned. Wenn Sie gleich GetOrAdd zeitig in verschiedenen Threads aufrufen valueFactory , kann mehrmals aufgerufen werden, es wird jedoch nur ein Schlüssel-Wert-Paar zum Wörterbuch hinzugefügt.If you call GetOrAdd simultaneously on different threads, valueFactory may be called multiple times, but only one key/value pair will be added to the dictionary.

Der Rückgabewert hängt davon ab, ob der Schlüssel im Wörterbuch vorhanden ist und ob ein Schlüssel/Wert von einem anderen Thread GetOrAdd eingefügt wird, nachdem valueFactory aufgerufen wurde, aber bevor einen Wert generiert:The return value depends on the presence of the key in the dictionary and whether a key/value is inserted by another thread after GetOrAdd is called but before valueFactory generates a value:

SzenarioScenario RückgabewertReturn value
Der Schlüssel ist bereits im Wörterbuch vorhanden.The key is already in the dictionary. Der vorhandene Wert wird zurückgegeben.The existing value is returned.
Der Schlüssel befindet sich nicht im Wörterbuch.The key is not in the dictionary. valueFactorygeneriert einen Wert.valueFactory generates a value. Beim Überprüfen des Schlüssels wird kein Schlüssel gefunden.On rechecking for the key, no key is found. Der Schlüssel/Wert wird in das Wörterbuch eingefügt, und der Wert wird zurückgegeben.The key/value is inserted into the dictionary, and the value is returned.
Der Schlüssel befindet sich nicht im Wörterbuch.The key is not in the dictionary. valueFactorygeneriert einen Wert.valueFactory generates a value. Beim valueFactory erzeugen des Werts fügt ein anderer Thread einen Wert für den Schlüssel ein.While valueFactory is generating the value, a different thread inserts a value for the key. Nachdem valueFactory ausgeführt wurde und der Schlüssel erneut überprüft wurde, wird der vom anderen Thread eingefügte Schlüssel gefunden.After valueFactory executes and upon rechecking for the key, the key inserted by the other thread is found. Der vom anderen Thread eingefügte Wert wird zurückgegeben.The value inserted by the other thread is returned.
Siehe auch

GetOrAdd(TKey, TValue) GetOrAdd(TKey, TValue) GetOrAdd(TKey, TValue) GetOrAdd(TKey, TValue)

Fügt dem ConcurrentDictionary<TKey,TValue> ein Schlüssel-Wert-Paar hinzu, wenn der Schlüssel nicht bereits vorhanden ist.Adds a key/value pair to the ConcurrentDictionary<TKey,TValue> if the key does not already exist. Gibt den neuen Wert oder den vorhandenen Wert zurück, wenn der Schlüssel existiert.Returns the new value, or the existing value if the key exists.

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

Parameter

key
TKey TKey TKey TKey

Der Schlüssel des hinzuzufügenden Elements.The key of the element to add.

value
TValue TValue TValue TValue

Der hinzuzufügende Wert, wenn der Schlüssel nicht bereits vorhanden ist.The value to be added, if the key does not already exist.

Gibt zurück

TValue TValue TValue TValue

Der Wert für den Schlüssel.The value for the key. Dies ist entweder der vorhandene Wert für den Schlüssel, wenn der Schlüssel bereits im Wörterbuch vorhanden ist, oder der neue Wert, wenn der Schlüssel nicht im Wörterbuch vorhanden war.This will be either the existing value for the key if the key is already in the dictionary, or the new value if the key was not in the dictionary.

Ausnahmen

Das Wörterbuch enthält bereits die maximale Anzahl von Elementen (MaxValue).The dictionary already contains the maximum number of elements (MaxValue).

Siehe auch

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

Fügt dem ConcurrentDictionary<TKey,TValue> mithilfe der angegebenen Funktion und eines Arguments ein Schlüssel-Wert-Paar hinzu, wenn der Schlüssel noch nicht vorhanden ist, oder gibt den vorhanden Wert zurück, wenn der Schlüssel vorhanden ist.Adds a key/value pair to the ConcurrentDictionary<TKey,TValue> by using the specified function and an argument if the key does not already exist, or returns the existing value if the key exists.

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

Typparameter

TArg

Der Typ eines Arguments, das an übergeben valueFactorywerden soll.The type of an argument to pass into valueFactory.

Parameter

key
TKey TKey TKey TKey

Der Schlüssel des hinzuzufügenden Elements.The key of the element to add.

valueFactory
Func<TKey,TArg,TValue>

Die Funktion, mit der ein Wert für den Schlüssel generiert wird.The function used to generate a value for the key.

factoryArgument

Ein Argumentwert, der an valueFactory übergeben werden soll.An argument value to pass into valueFactory.

Gibt zurück

TValue TValue TValue TValue

Der Wert für den Schlüssel.The value for the key. Dies ist entweder der vorhandene Wert für den Schlüssel, wenn der Schlüssel bereits im Wörterbuch vorhanden ist, oder der neue Wert, wenn der Schlüssel nicht im Wörterbuch vorhanden war.This will be either the existing value for the key if the key is already in the dictionary, or the new value if the key was not in the dictionary.

Ausnahmen

key ist ein null-Verweis („Nothing“ in Visual Basic).key is a null reference (Nothing in Visual Basic).

Das Wörterbuch enthält zu viele Elemente.The dictionary contains too many elements.

Hinweise

Bei Änderungen und Schreibvorgängen für das Wörter ConcurrentDictionary<TKey,TValue> Buch verwendet differenzierte Sperren, um die Thread Sicherheit sicherzustellen.For modifications and write operations to the dictionary, ConcurrentDictionary<TKey,TValue> uses fine-grained locking to ensure thread safety. (Lesevorgänge für das Wörterbuch werden auf Sperr freie Weise ausgeführt.) Der valueFactory Delegat wird jedoch außerhalb der Sperren aufgerufen, um Probleme zu vermeiden, die durch die Ausführung von unbekanntem Code unter einer Sperre auftreten können.(Read operations on the dictionary are performed in a lock-free manner.) However, the valueFactory delegate is called outside the locks to avoid the problems that can arise from executing unknown code under a lock. Daher ist nicht atomarisch in Bezug auf alle anderen Vorgänge in der ConcurrentDictionary<TKey,TValue> -Klasse. GetOrAddTherefore, GetOrAdd is not atomic with regards to all other operations on the ConcurrentDictionary<TKey,TValue> class.

Da ein Schlüssel/Wert von einem anderen Thread eingefügt werden kann valueFactory , während einen Wert generiert, können Sie sich nicht darauf valueFactory verlassen, dass der erstellte Wert nur, wenn er ausgeführt wurde, in das Wörterbuch eingefügt und zurückgegeben wird.Since a key/value can be inserted by another thread while valueFactory is generating a value, you cannot trust that just because valueFactory executed, its produced value will be inserted into the dictionary and returned. Wenn Sie gleich GetOrAdd zeitig in verschiedenen Threads aufrufen valueFactory , kann mehrmals aufgerufen werden, es wird jedoch nur ein Schlüssel-Wert-Paar zum Wörterbuch hinzugefügt.If you call GetOrAdd simultaneously on different threads, valueFactory may be called multiple times, but only one key/value pair will be added to the dictionary.

Der Rückgabewert hängt davon ab, ob der Schlüssel im Wörterbuch vorhanden ist und ob ein Schlüssel/Wert von einem anderen Thread GetOrAdd eingefügt wird, nachdem valueFactory aufgerufen wurde, aber bevor einen Wert generiert:The return value depends on the presence of the key in the dictionary and whether a key/value is inserted by another thread after GetOrAdd is called but before valueFactory generates a value:

SzenarioScenario RückgabewertReturn value
Der Schlüssel ist bereits im Wörterbuch vorhanden.The key is already in the dictionary. Der vorhandene Wert wird zurückgegeben.The existing value is returned.
Der Schlüssel befindet sich nicht im Wörterbuch.The key is not in the dictionary. valueFactorygeneriert einen Wert.valueFactory generates a value. Beim Überprüfen des Schlüssels wird kein Schlüssel gefunden.On rechecking for the key, no key is found. Der Schlüssel/Wert wird in das Wörterbuch eingefügt, und der Wert wird zurückgegeben.The key/value is inserted into the dictionary, and the value is returned.
Der Schlüssel befindet sich nicht im Wörterbuch.The key is not in the dictionary. valueFactorygeneriert einen Wert.valueFactory generates a value. Beim valueFactory erzeugen des Werts fügt ein anderer Thread einen Wert für den Schlüssel ein.While valueFactory is generating the value, a different thread inserts a value for the key. Nachdem valueFactory ausgeführt wurde und der Schlüssel erneut überprüft wurde, wird der vom anderen Thread eingefügte Schlüssel gefunden.After valueFactory executes and upon rechecking for the key, the key inserted by the other thread is found. Der vom anderen Thread eingefügte Wert wird zurückgegeben.The value inserted by the other thread is returned.

Gilt für: