ConcurrentDictionary<TKey,TValue>.GetOrAdd Metod

Definition

Lägger till ett nyckel/värde-par till ConcurrentDictionary<TKey,TValue> om nyckeln inte redan finns. Returnerar det nya värdet eller det befintliga värdet om nyckeln redan finns.

Överlagringar

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

Lägger till ett nyckel/värde-par i ConcurrentDictionary<TKey,TValue> med hjälp av den angivna funktionen om nyckeln inte redan finns. Returnerar det nya värdet eller det befintliga värdet om nyckeln finns.

GetOrAdd(TKey, TValue)

Lägger till ett nyckel/värde-par till ConcurrentDictionary<TKey,TValue> om nyckeln inte redan finns. Returnerar det nya värdet eller det befintliga värdet om nyckeln finns.

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

Lägger till ett nyckel/värde-par i ConcurrentDictionary<TKey,TValue> med hjälp av den angivna funktionen och ett argument om nyckeln inte redan finns, eller returnerar det befintliga värdet om nyckeln finns.

Exempel

I följande exempel visas hur du anropar GetOrAdd metoden:

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>)

Lägger till ett nyckel/värde-par i ConcurrentDictionary<TKey,TValue> med hjälp av den angivna funktionen om nyckeln inte redan finns. Returnerar det nya värdet eller det befintliga värdet om nyckeln finns.

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

Parametrar

key
TKey

Nyckeln för elementet som ska läggas till.

valueFactory
Func<TKey,TValue>

Funktionen som används för att generera ett värde för nyckeln.

Returer

TValue

Värdet för nyckeln. Det här är antingen det befintliga värdet för nyckeln om nyckeln redan finns i ordlistan eller det nya värdet om nyckeln inte fanns i ordlistan.

Undantag

key eller valueFactory är null.

Ordlistan innehåller för många element.

Kommentarer

För ändringar och skrivåtgärder i ordlistan ConcurrentDictionary<TKey,TValue> använder finkornig låsning för att säkerställa trådsäkerheten. (Läsåtgärder i ordlistan utförs på ett låsfritt sätt.) Ombudet valueFactory anropas dock utanför låsen för att undvika de problem som kan uppstå vid körning av okänd kod under ett lås. GetOrAdd Är därför inte atomisk när det gäller alla andra åtgärder i ConcurrentDictionary<TKey,TValue> klassen.

Eftersom en nyckel/ett värde kan infogas av en annan tråd medan valueFactory ett värde genereras kan du inte lita på att bara för valueFactory att det körs infogas dess genererade värde i ordlistan och returneras. Om du anropar GetOrAdd samtidigt i olika trådar valueFactory kan det anropas flera gånger, men endast ett nyckel/värde-par läggs till i ordlistan.

Returvärdet beror på förekomsten av nyckeln i ordlistan och om en nyckel/ett värde infogas av en annan tråd efter GetOrAdd anropas men innan valueFactory genererar ett värde:

Scenario Returvärde
Nyckeln finns redan i ordlistan. Det befintliga värdet returneras.
Nyckeln finns inte i ordlistan. valueFactory genererar ett värde. Vid återkontroll för nyckeln hittas ingen nyckel. Nyckeln/värdet infogas i ordlistan och värdet returneras.
Nyckeln finns inte i ordlistan. valueFactory genererar ett värde. Medan valueFactory genererar värdet infogar en annan tråd ett värde för nyckeln. När valueFactory du har kört och när du har kontrollerat nyckeln igen hittas nyckeln som infogats av den andra tråden. Värdet som infogas av den andra tråden returneras.

Se även

Gäller för

GetOrAdd(TKey, TValue)

Lägger till ett nyckel/värde-par till ConcurrentDictionary<TKey,TValue> om nyckeln inte redan finns. Returnerar det nya värdet eller det befintliga värdet om nyckeln finns.

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

Parametrar

key
TKey

Nyckeln för elementet som ska läggas till.

value
TValue

Värdet som ska läggas till, om nyckeln inte redan finns.

Returer

TValue

Värdet för nyckeln. Det här är antingen det befintliga värdet för nyckeln om nyckeln redan finns i ordlistan eller det nya värdet om nyckeln inte fanns i ordlistan.

Undantag

key är null.

Ordlistan innehåller för många element.

Se även

Gäller för

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

Lägger till ett nyckel/värde-par i ConcurrentDictionary<TKey,TValue> med hjälp av den angivna funktionen och ett argument om nyckeln inte redan finns, eller returnerar det befintliga värdet om nyckeln finns.

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

Typparametrar

TArg

Typen av argument som ska skickas till valueFactory.

Parametrar

key
TKey

Nyckeln för elementet som ska läggas till.

valueFactory
Func<TKey,TArg,TValue>

Funktionen som används för att generera ett värde för nyckeln.

factoryArgument
TArg

Ett argumentvärde som ska skickas till valueFactory.

Returer

TValue

Värdet för nyckeln. Det här är antingen det befintliga värdet för nyckeln om nyckeln redan finns i ordlistan eller det nya värdet om nyckeln inte fanns i ordlistan.

Undantag

key är en referens för null (ingenting i Visual Basic).

Ordlistan innehåller för många element.

Kommentarer

För ändringar och skrivåtgärder i ordlistan ConcurrentDictionary<TKey,TValue> använder finkornig låsning för att säkerställa trådsäkerheten. (Läsåtgärder i ordlistan utförs på ett låsfritt sätt.) Ombudet valueFactory anropas dock utanför låsen för att undvika de problem som kan uppstå vid körning av okänd kod under ett lås. GetOrAdd Är därför inte atomisk när det gäller alla andra åtgärder i ConcurrentDictionary<TKey,TValue> klassen.

Eftersom en nyckel/ett värde kan infogas av en annan tråd medan valueFactory ett värde genereras kan du inte lita på att bara för valueFactory att det körs infogas dess genererade värde i ordlistan och returneras. Om du anropar GetOrAdd samtidigt i olika trådar valueFactory kan det anropas flera gånger, men endast ett nyckel/värde-par läggs till i ordlistan.

Returvärdet beror på förekomsten av nyckeln i ordlistan och om en nyckel/ett värde infogas av en annan tråd efter GetOrAdd anropas men innan valueFactory genererar ett värde:

Scenario Returvärde
Nyckeln finns redan i ordlistan. Det befintliga värdet returneras.
Nyckeln finns inte i ordlistan. valueFactory genererar ett värde. Vid återkontroll för nyckeln hittas ingen nyckel. Nyckeln/värdet infogas i ordlistan och värdet returneras.
Nyckeln finns inte i ordlistan. valueFactory genererar ett värde. Medan valueFactory genererar värdet infogar en annan tråd ett värde för nyckeln. När valueFactory du har kört och när du har kontrollerat nyckeln igen hittas nyckeln som infogats av den andra tråden. Värdet som infogas av den andra tråden returneras.

Gäller för