ConcurrentDictionary<TKey,TValue>.AddOrUpdate Methode

Definitie

Hiermee voegt u een sleutel/waardepaar toe aan de ConcurrentDictionary<TKey,TValue> sleutel als de sleutel nog niet bestaat of werkt u een sleutel/waardepaar bij in de ConcurrentDictionary<TKey,TValue> sleutel als de sleutel al bestaat.

Overloads

Name Description
AddOrUpdate(TKey, Func<TKey,TValue>, Func<TKey,TValue,TValue>)

Gebruikt de opgegeven functies om een sleutel/waardepaar toe te voegen aan de ConcurrentDictionary<TKey,TValue> sleutel als de sleutel nog niet bestaat, of om een sleutel-/waardepaar bij te werken in de ConcurrentDictionary<TKey,TValue> als de sleutel al bestaat.

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

Voegt een sleutel/waardepaar toe aan de ConcurrentDictionary<TKey,TValue> sleutel als de sleutel nog niet bestaat of werkt een sleutel/waardepaar bij in de ConcurrentDictionary<TKey,TValue> met behulp van de opgegeven functie als de sleutel al bestaat.

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

Gebruikt de opgegeven functies en het argument om een sleutel/waardepaar toe te voegen aan de ConcurrentDictionary<TKey,TValue> sleutel als de sleutel nog niet bestaat of om een sleutel-/waardepaar bij te werken in de ConcurrentDictionary<TKey,TValue> sleutel als de sleutel al bestaat.

Voorbeelden

In het volgende voorbeeld ziet u hoe u de AddOrUpdate methode aanroept:

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

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

Gebruikt de opgegeven functies om een sleutel/waardepaar toe te voegen aan de ConcurrentDictionary<TKey,TValue> sleutel als de sleutel nog niet bestaat, of om een sleutel-/waardepaar bij te werken in de ConcurrentDictionary<TKey,TValue> als de sleutel al bestaat.

public:
 TValue AddOrUpdate(TKey key, Func<TKey, TValue> ^ addValueFactory, Func<TKey, TValue, TValue> ^ updateValueFactory);
public TValue AddOrUpdate(TKey key, Func<TKey,TValue> addValueFactory, Func<TKey,TValue,TValue> updateValueFactory);
member this.AddOrUpdate : 'Key * Func<'Key, 'Value> * Func<'Key, 'Value, 'Value> -> 'Value
Public Function AddOrUpdate (key As TKey, addValueFactory As Func(Of TKey, TValue), updateValueFactory As Func(Of TKey, TValue, TValue)) As TValue

Parameters

key
TKey

De sleutel die moet worden toegevoegd of waarvan de waarde moet worden bijgewerkt.

addValueFactory
Func<TKey,TValue>

De functie die wordt gebruikt voor het genereren van een waarde voor een afwezige sleutel.

updateValueFactory
Func<TKey,TValue,TValue>

De functie die wordt gebruikt om een nieuwe waarde voor een bestaande sleutel te genereren op basis van de bestaande waarde van de sleutel.

Retouren

TValue

De nieuwe waarde voor de sleutel. Dit is het resultaat van addValueFactory (als de sleutel ontbreekt) of het resultaat van updateValueFactory (als de sleutel aanwezig was).

Uitzonderingen

key, addValueFactoryof updateValueFactory is null.

De woordenlijst bevat te veel elementen.

Opmerkingen

Als u tegelijk belt AddOrUpdate op verschillende threads, kan het meerdere keren worden aangeroepen, addValueFactory maar het sleutel-waardepaar wordt mogelijk niet toegevoegd aan de woordenlijst voor elke aanroep.

Voor wijzigingen en schrijfbewerkingen in de woordenlijst gebruikt ConcurrentDictionary<TKey,TValue> u fijnmazige vergrendeling om de veiligheid van threads te garanderen (leesbewerkingen in de woordenlijst worden op een vergrendelingsvrije manier uitgevoerd). De addValueFactory en updateValueFactory gedelegeerden kunnen meerdere keren worden uitgevoerd om te controleren of de waarde is toegevoegd of bijgewerkt zoals verwacht. Ze worden echter buiten de vergrendelingen aangeroepen om de problemen te voorkomen die kunnen ontstaan door het uitvoeren van onbekende code onder een vergrendeling. AddOrUpdate Daarom is het niet atomisch met betrekking tot alle andere bewerkingen op de ConcurrentDictionary<TKey,TValue> klasse.

Zie ook

Van toepassing op

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

Voegt een sleutel/waardepaar toe aan de ConcurrentDictionary<TKey,TValue> sleutel als de sleutel nog niet bestaat of werkt een sleutel/waardepaar bij in de ConcurrentDictionary<TKey,TValue> met behulp van de opgegeven functie als de sleutel al bestaat.

public:
 TValue AddOrUpdate(TKey key, TValue addValue, Func<TKey, TValue, TValue> ^ updateValueFactory);
public TValue AddOrUpdate(TKey key, TValue addValue, Func<TKey,TValue,TValue> updateValueFactory);
member this.AddOrUpdate : 'Key * 'Value * Func<'Key, 'Value, 'Value> -> 'Value
Public Function AddOrUpdate (key As TKey, addValue As TValue, updateValueFactory As Func(Of TKey, TValue, TValue)) As TValue

Parameters

key
TKey

De sleutel die moet worden toegevoegd of waarvan de waarde moet worden bijgewerkt.

addValue
TValue

De waarde die moet worden toegevoegd voor een afwezige sleutel.

updateValueFactory
Func<TKey,TValue,TValue>

De functie die wordt gebruikt om een nieuwe waarde voor een bestaande sleutel te genereren op basis van de bestaande waarde van de sleutel.

Retouren

TValue

De nieuwe waarde voor de sleutel. Dit is addValue (als de sleutel afwezig was) of het resultaat van updateValueFactory (als de sleutel aanwezig was).

Uitzonderingen

key of updateValueFactory is null.

De woordenlijst bevat te veel elementen.

Voorbeelden

In het volgende codevoorbeeld ziet u hoe u een ConcurrentDictionary<TKey,TValue> addOrUpdate-methode initialiseert en hoe u een extra item aan de verzameling toevoegt en de bestaande items bijwerkt.

using System;
using System.Collections.Concurrent;

class CD_Ctor
{
    // Demonstrates:
    //      ConcurrentDictionary<TKey, TValue> ctor(concurrencyLevel, initialCapacity)
    //      ConcurrentDictionary<TKey, TValue>[TKey]
    static void Main()
    {
        // We know how many items we want to insert into the ConcurrentDictionary.
        // So set the initial capacity to some prime number above that, to ensure that
        // the ConcurrentDictionary does not need to be resized while initializing it.
        int HIGHNUMBER = 64;
        int initialCapacity = 101;

        // The higher the concurrencyLevel, the higher the theoretical number of operations
        // that could be performed concurrently on the ConcurrentDictionary.  However, global
        // operations like resizing the dictionary take longer as the concurrencyLevel rises.
        // For the purposes of this example, we'll compromise at numCores * 2.
        int numProcs = Environment.ProcessorCount;
        int concurrencyLevel = numProcs * 2;

        // Construct the dictionary with the desired concurrencyLevel and initialCapacity
        ConcurrentDictionary<int, int> cd = new ConcurrentDictionary<int, int>(concurrencyLevel, initialCapacity);

        // Initialize the dictionary
        for (int i = 1; i <= HIGHNUMBER; i++) cd[i] = i * i;

        Console.WriteLine("The square of 23 is {0} (should be {1})", cd[23], 23 * 23);

        // Now iterate through, adding one to the end of the list. Existing items should be updated to be divided by their
        // key  and a new item will be added that is the square of its key.
        for (int i = 1; i <= HIGHNUMBER + 1; i++)
          cd.AddOrUpdate(i, i * i, (k,v) => v / i);

        Console.WriteLine("The square root of 529 is {0} (should be {1})", cd[23], 529 / 23);
        Console.WriteLine("The square of 65 is {0} (should be {1})", cd[HIGHNUMBER + 1], ((HIGHNUMBER + 1) * (HIGHNUMBER + 1)));
    }
}
open System
open System.Collections.Concurrent

// Demonstrates:
//      ConcurrentDictionary<TKey, TValue> ctor(concurrencyLevel, initialCapacity)
//      ConcurrentDictionary<TKey, TValue>[TKey]

// We know how many items we want to insert into the ConcurrentDictionary.
// So set the initial capacity to some prime number above that, to ensure that
// the ConcurrentDictionary does not need to be resized while initializing it.
let HIGHNUMBER = 64
let initialCapacity = 101

// The higher the concurrencyLevel, the higher the theoretical number of operations
// that could be performed concurrently on the ConcurrentDictionary.  However, global
// operations like resizing the dictionary take longer as the concurrencyLevel rises.
// For the purposes of this example, we'll compromise at numCores * 2.
let numProcs = Environment.ProcessorCount
let concurrencyLevel = numProcs * 2

// Construct the dictionary with the desired concurrencyLevel and initialCapacity
let cd = ConcurrentDictionary<int, int>(concurrencyLevel, initialCapacity)

// Initialize the dictionary
for i = 1 to HIGHNUMBER do
    cd[i] <- i * i

printfn $"The square of 23 is {cd[23]} (should be {23 * 23})"

// Now iterate through, adding one to the end of the list. Existing items should be updated to be divided by their
// key  and a new item will be added that is the square of its key.
for i = 1 to HIGHNUMBER + 1 do
    cd.AddOrUpdate(i, i * i, (fun k v -> v / i)) |> ignore

printfn $"The square root of 529 is {cd[23]} (should be {529 / 23})"
printfn $"The square of 65 is {cd[HIGHNUMBER + 1]} (should be {(HIGHNUMBER + 1) * (HIGHNUMBER + 1)})"
Imports System.Collections.Concurrent

Class CD_Ctor
    ' Demonstrates: 
    '      ConcurrentDictionary<TKey, TValue> ctor(concurrencyLevel, initialCapacity) 
    '      ConcurrentDictionary<TKey, TValue>[TKey] 
    Public Shared Sub Main()
        ' We know how many items we want to insert into the ConcurrentDictionary. 
        ' So set the initial capacity to some prime number above that, to ensure that 
        ' the ConcurrentDictionary does not need to be resized while initializing it. 
        Dim HIGHNUMBER As Integer = 64
        Dim initialCapacity As Integer = 101

        ' The higher the concurrencyLevel, the higher the theoretical number of operations 
        ' that could be performed concurrently on the ConcurrentDictionary.  However, global 
        ' operations like resizing the dictionary take longer as the concurrencyLevel rises.  
        ' For the purposes of this example, we'll compromise at numCores * 2. 
        Dim numProcs As Integer = Environment.ProcessorCount
        Dim concurrencyLevel As Integer = numProcs * 2

        ' Construct the dictionary with the desired concurrencyLevel and initialCapacity
        Dim cd As New ConcurrentDictionary(Of Integer, Integer)(concurrencyLevel, initialCapacity)

        ' Initialize the dictionary 
        For i As Integer = 1 To HIGHNUMBER
            cd(i) = i * i
        Next

        Console.WriteLine("The square of 23 is {0} (should be {1})", cd(23), 23 * 23)

        ' Now iterate through, adding one to the end of the list. Existing items should be updated to be divided by their 
        ' key  and a new item will be added that is the square of its key.
        For i As Integer = 1 To HIGHNUMBER + 1

            cd.AddOrUpdate(i, i * i, Function(k, v)
                                         Return v / i
                                     End Function)
        Next

        Console.WriteLine("The square root of 529 is {0} (should be {1})", cd(23), 529 / 23)
        Console.WriteLine("The square of 65 is {0} (should be {1})", cd(HIGHNUMBER + 1), ((HIGHNUMBER + 1) * (HIGHNUMBER + 1)))

    End Sub
End Class

Voor wijzigingen en schrijfbewerkingen in de woordenlijst gebruikt ConcurrentDictionary<TKey,TValue> u fijnmazige vergrendeling om de veiligheid van threads te garanderen. (Leesbewerkingen in de woordenlijst worden op een vergrendelingsvrije manier uitgevoerd.) De addValueFactory en updateValueFactory gedelegeerden kunnen meerdere keren worden uitgevoerd om te controleren of de waarde is toegevoegd of bijgewerkt zoals verwacht. Ze worden echter buiten de vergrendelingen aangeroepen om de problemen te voorkomen die kunnen ontstaan door het uitvoeren van onbekende code onder een vergrendeling. AddOrUpdate Daarom is het niet atomisch met betrekking tot alle andere bewerkingen op de ConcurrentDictionary<TKey,TValue> klasse.

Zie ook

Van toepassing op

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

Gebruikt de opgegeven functies en het argument om een sleutel/waardepaar toe te voegen aan de ConcurrentDictionary<TKey,TValue> sleutel als de sleutel nog niet bestaat of om een sleutel-/waardepaar bij te werken in de ConcurrentDictionary<TKey,TValue> sleutel als de sleutel al bestaat.

public:
generic <typename TArg>
 TValue AddOrUpdate(TKey key, Func<TKey, TArg, TValue> ^ addValueFactory, Func<TKey, TValue, TArg, TValue> ^ updateValueFactory, TArg factoryArgument);
public TValue AddOrUpdate<TArg>(TKey key, Func<TKey,TArg,TValue> addValueFactory, Func<TKey,TValue,TArg,TValue> updateValueFactory, TArg factoryArgument);
member this.AddOrUpdate : 'Key * Func<'Key, 'Arg, 'Value> * Func<'Key, 'Value, 'Arg, 'Value> * 'Arg -> 'Value
Public Function AddOrUpdate(Of TArg) (key As TKey, addValueFactory As Func(Of TKey, TArg, TValue), updateValueFactory As Func(Of TKey, TValue, TArg, TValue), factoryArgument As TArg) As TValue

Type parameters

TArg

Het type argument dat moet worden doorgegeven aan addValueFactory en updateValueFactory.

Parameters

key
TKey

De sleutel die moet worden toegevoegd of waarvan de waarde moet worden bijgewerkt.

addValueFactory
Func<TKey,TArg,TValue>

De functie die wordt gebruikt voor het genereren van een waarde voor een afwezige sleutel.

updateValueFactory
Func<TKey,TValue,TArg,TValue>

De functie die wordt gebruikt om een nieuwe waarde voor een bestaande sleutel te genereren op basis van de bestaande waarde van de sleutel.

factoryArgument
TArg

Een argument dat moet worden doorgegeven aan addValueFactory en updateValueFactory.

Retouren

TValue

De nieuwe waarde voor de sleutel. Dit is het resultaat van addValueFactory (als de sleutel ontbreekt) of het resultaat van updateValueFactory (als de sleutel aanwezig was).

Uitzonderingen

key, addValueFactory of updateValueFactory is een null-verwijzing (niets in Visual Basic).

De woordenlijst bevat te veel elementen.

Opmerkingen

Als u tegelijk belt AddOrUpdate op verschillende threads, kan het meerdere keren worden aangeroepen, addValueFactory maar het sleutel-waardepaar wordt mogelijk niet toegevoegd aan de woordenlijst voor elke aanroep.

Voor wijzigingen en schrijfbewerkingen in de woordenlijst gebruikt ConcurrentDictionary<TKey,TValue> u fijnmazige vergrendeling om de veiligheid van threads te garanderen. (Leesbewerkingen in de woordenlijst worden op een vergrendelingsvrije manier uitgevoerd.) De addValueFactory en updateValueFactory gedelegeerden kunnen meerdere keren worden uitgevoerd om te controleren of de waarde is toegevoegd of bijgewerkt zoals verwacht. Ze worden echter buiten de vergrendelingen aangeroepen om de problemen te voorkomen die kunnen ontstaan door het uitvoeren van onbekende code onder een vergrendeling. AddOrUpdate Daarom is het niet atomisch met betrekking tot alle andere bewerkingen op de ConcurrentDictionary<TKey,TValue> klasse.

Van toepassing op