ConcurrentDictionary<TKey,TValue>.GetOrAdd Metodo

Definizione

Aggiunge una coppia chiave/valore a ConcurrentDictionary<TKey,TValue> se la chiave non esiste già.Adds a key/value pair to the ConcurrentDictionary<TKey,TValue> if the key does not already exist. Restituisce il nuovo valore, oppure, se la chiave esiste già, restituisce il valore esistente.Returns the new value, or the existing value if the key already exists.

Overload

GetOrAdd(TKey, Func<TKey,TValue>)

Aggiunge una coppia chiave/valore a ConcurrentDictionary<TKey,TValue> usando la funzione specificata se la chiave non esiste già.Adds a key/value pair to the ConcurrentDictionary<TKey,TValue> by using the specified function if the key does not already exist. Restituisce il nuovo valore, oppure, se la chiave esiste, restituisce il valore esistente.Returns the new value, or the existing value if the key exists.

GetOrAdd(TKey, TValue)

Aggiunge una coppia chiave/valore a ConcurrentDictionary<TKey,TValue> se la chiave non esiste già.Adds a key/value pair to the ConcurrentDictionary<TKey,TValue> if the key does not already exist. Restituisce il nuovo valore, oppure, se la chiave esiste, restituisce il valore esistente.Returns the new value, or the existing value if the key exists.

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

Aggiunge una coppia chiave/valore a ConcurrentDictionary<TKey,TValue> usando la funzione specificata e un argomento se la chiave non esiste ancora, oppure, se la chiave esiste già, restituisce il valore esistente.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.

Esempi

Nell'esempio seguente viene illustrato come chiamare il GetOrAdd metodo: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>)

Aggiunge una coppia chiave/valore a ConcurrentDictionary<TKey,TValue> usando la funzione specificata se la chiave non esiste già.Adds a key/value pair to the ConcurrentDictionary<TKey,TValue> by using the specified function if the key does not already exist. Restituisce il nuovo valore, oppure, se la chiave esiste, restituisce il valore esistente.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

Parametri

key
TKey

Chiave dell'elemento da aggiungere.The key of the element to add.

valueFactory
Func<TKey,TValue>

Funzione usata per generare un valore per la chiave.The function used to generate a value for the key.

Restituisce

TValue

Valore della chiave.The value for the key. Si tratta del valore esistente se la chiave esiste già nel dizionario o del nuovo valore se la chiave non è presente nel dizionario.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.

Eccezioni

key o valueFactory è null.key or valueFactory is null.

Il dizionario contiene già il numero massimo di elementi (MaxValue).The dictionary already contains the maximum number of elements (MaxValue).

Commenti

Per le modifiche e le operazioni di scrittura nel ConcurrentDictionary<TKey,TValue> dizionario, usa un blocco con granularità fine per garantire thread safety.For modifications and write operations to the dictionary, ConcurrentDictionary<TKey,TValue> uses fine-grained locking to ensure thread safety. Le operazioni di lettura sul dizionario vengono eseguite in modo senza blocco. Tuttavia, il valueFactory delegato viene chiamato all'esterno dei blocchi per evitare i problemi che possono derivare dall'esecuzione di codice sconosciuto in un blocco.(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. Pertanto, GetOrAdd non è atomico per quanto riguarda tutte le altre operazioni ConcurrentDictionary<TKey,TValue> sulla classe.Therefore, GetOrAdd is not atomic with regards to all other operations on the ConcurrentDictionary<TKey,TValue> class.

Poiché una chiave/valore può essere inserito da un altro thread valueFactory mentre genera un valore, non è possibile considerare attendibile valueFactory che solo perché eseguito, il valore prodotto verrà inserito nel dizionario e restituito.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. Se si chiama GetOrAdd simultaneamente su thread diversi valueFactory , può essere chiamato più volte, ma solo una coppia chiave/valore verrà aggiunta al dizionario.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.

Il valore restituito dipende dalla presenza della chiave nel dizionario e dal fatto che un tasto o un valore venga inserito da un altro thread dopo GetOrAdd che è stato chiamato valueFactory ma prima che venga generato un valore: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:

ScenarioScenario Valore restituitoReturn value
La chiave è già presente nel dizionario.The key is already in the dictionary. Viene restituito il valore esistente.The existing value is returned.
La chiave non è presente nel dizionario.The key is not in the dictionary. valueFactorygenera un valore.valueFactory generates a value. Quando si verifica il controllo della chiave, non viene trovata alcuna chiave.On rechecking for the key, no key is found. La chiave o il valore viene inserito nel dizionario e viene restituito il valore.The key/value is inserted into the dictionary, and the value is returned.
La chiave non è presente nel dizionario.The key is not in the dictionary. valueFactorygenera un valore.valueFactory generates a value. Mentre valueFactory genera il valore, un thread diverso inserisce un valore per la chiave.While valueFactory is generating the value, a different thread inserts a value for the key. Dopo valueFactory l'esecuzione di e la riverifica della chiave, viene trovata la chiave inserita dall'altro thread.After valueFactory executes and upon rechecking for the key, the key inserted by the other thread is found. Viene restituito il valore inserito dall'altro thread.The value inserted by the other thread is returned.

Vedi anche

GetOrAdd(TKey, TValue)

Aggiunge una coppia chiave/valore a ConcurrentDictionary<TKey,TValue> se la chiave non esiste già.Adds a key/value pair to the ConcurrentDictionary<TKey,TValue> if the key does not already exist. Restituisce il nuovo valore, oppure, se la chiave esiste, restituisce il valore esistente.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

Parametri

key
TKey

Chiave dell'elemento da aggiungere.The key of the element to add.

value
TValue

Valore da aggiungere, se la chiave non esiste ancora.The value to be added, if the key does not already exist.

Restituisce

TValue

Valore della chiave.The value for the key. Si tratta del valore esistente se la chiave esiste già nel dizionario o del nuovo valore se la chiave non è presente nel dizionario.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.

Eccezioni

key è null.key is null.

Il dizionario contiene già il numero massimo di elementi (MaxValue).The dictionary already contains the maximum number of elements (MaxValue).

Vedi anche

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

Aggiunge una coppia chiave/valore a ConcurrentDictionary<TKey,TValue> usando la funzione specificata e un argomento se la chiave non esiste ancora, oppure, se la chiave esiste già, restituisce il valore esistente.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

Parametri di tipo

TArg

Tipo di un argomento da passare in valueFactory.The type of an argument to pass into valueFactory.

Parametri

key
TKey

Chiave dell'elemento da aggiungere.The key of the element to add.

valueFactory
Func<TKey,TArg,TValue>

Funzione usata per generare un valore per la chiave.The function used to generate a value for the key.

factoryArgument
TArg

Valore dell'argomento da passare in valueFactory.An argument value to pass into valueFactory.

Restituisce

TValue

Valore della chiave.The value for the key. Si tratta del valore esistente se la chiave esiste già nel dizionario o del nuovo valore se la chiave non è presente nel dizionario.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.

Eccezioni

key è un riferimento null (Nothing in Visual Basic).key is a null reference (Nothing in Visual Basic).

Il dizionario contiene troppi elementi.The dictionary contains too many elements.

Commenti

Per le modifiche e le operazioni di scrittura nel ConcurrentDictionary<TKey,TValue> dizionario, usa un blocco con granularità fine per garantire thread safety.For modifications and write operations to the dictionary, ConcurrentDictionary<TKey,TValue> uses fine-grained locking to ensure thread safety. Le operazioni di lettura sul dizionario vengono eseguite in modo senza blocco. Tuttavia, il valueFactory delegato viene chiamato all'esterno dei blocchi per evitare i problemi che possono derivare dall'esecuzione di codice sconosciuto in un blocco.(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. Pertanto, GetOrAdd non è atomico per quanto riguarda tutte le altre operazioni ConcurrentDictionary<TKey,TValue> sulla classe.Therefore, GetOrAdd is not atomic with regards to all other operations on the ConcurrentDictionary<TKey,TValue> class.

Poiché una chiave/valore può essere inserito da un altro thread valueFactory mentre genera un valore, non è possibile considerare attendibile valueFactory che solo perché eseguito, il valore prodotto verrà inserito nel dizionario e restituito.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. Se si chiama GetOrAdd simultaneamente su thread diversi valueFactory , può essere chiamato più volte, ma solo una coppia chiave/valore verrà aggiunta al dizionario.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.

Il valore restituito dipende dalla presenza della chiave nel dizionario e dal fatto che un tasto o un valore venga inserito da un altro thread dopo GetOrAdd che è stato chiamato valueFactory ma prima che venga generato un valore: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:

ScenarioScenario Valore restituitoReturn value
La chiave è già presente nel dizionario.The key is already in the dictionary. Viene restituito il valore esistente.The existing value is returned.
La chiave non è presente nel dizionario.The key is not in the dictionary. valueFactorygenera un valore.valueFactory generates a value. Quando si verifica il controllo della chiave, non viene trovata alcuna chiave.On rechecking for the key, no key is found. La chiave o il valore viene inserito nel dizionario e viene restituito il valore.The key/value is inserted into the dictionary, and the value is returned.
La chiave non è presente nel dizionario.The key is not in the dictionary. valueFactorygenera un valore.valueFactory generates a value. Mentre valueFactory genera il valore, un thread diverso inserisce un valore per la chiave.While valueFactory is generating the value, a different thread inserts a value for the key. Dopo valueFactory l'esecuzione di e la riverifica della chiave, viene trovata la chiave inserita dall'altro thread.After valueFactory executes and upon rechecking for the key, the key inserted by the other thread is found. Viene restituito il valore inserito dall'altro thread.The value inserted by the other thread is returned.

Si applica a