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

定義

如果索引鍵不存在,則將索引鍵/值組加入 ConcurrentDictionary<TKey,TValue>,如果索引鍵存在,則更新 ConcurrentDictionary<TKey,TValue> 中的索引鍵/值組。Adds a key/value pair to the ConcurrentDictionary<TKey,TValue> if the key does not already exist, or updates a key/value pair in the ConcurrentDictionary<TKey,TValue> if the key already exists.

多載

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

如果索引鍵不存在,則使用指定的函式將索引鍵/值組加入 ConcurrentDictionary<TKey,TValue>;如果索引鍵已經存在,則更新 ConcurrentDictionary<TKey,TValue> 中的索引鍵/值組。Uses the specified functions to add a key/value pair to the ConcurrentDictionary<TKey,TValue> if the key does not already exist, or to update a key/value pair in the ConcurrentDictionary<TKey,TValue> if the key already exists.

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

如果索引鍵不存在,則將索引鍵/值組加入 ConcurrentDictionary<TKey,TValue>;如果索引鍵已經存在,則使用指定的函式更新 ConcurrentDictionary<TKey,TValue> 中的索引鍵/值組。Adds a key/value pair to the ConcurrentDictionary<TKey,TValue> if the key does not already exist, or updates a key/value pair in the ConcurrentDictionary<TKey,TValue> by using the specified function if the key already exists.

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

若機碼不存在,使用指定的函式與引數將機碼/值組新增到 ConcurrentDictionary<TKey,TValue>,或若機碼存在,更新 ConcurrentDictionary<TKey,TValue> 中的機碼/值組。Uses the specified functions and argument to add a key/value pair to the ConcurrentDictionary<TKey,TValue> if the key does not already exist, or to update a key/value pair in the ConcurrentDictionary<TKey,TValue> if the key already exists.

範例

下列範例示範如何呼叫AddOrUpdate方法:The following example shows how to call the AddOrUpdate 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

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

如果索引鍵不存在,則使用指定的函式將索引鍵/值組加入 ConcurrentDictionary<TKey,TValue>;如果索引鍵已經存在,則更新 ConcurrentDictionary<TKey,TValue> 中的索引鍵/值組。Uses the specified functions to add a key/value pair to the ConcurrentDictionary<TKey,TValue> if the key does not already exist, or to update a key/value pair in the ConcurrentDictionary<TKey,TValue> if the key already exists.

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

參數

key
TKey TKey TKey TKey

要加入或應該更新其值的索引鍵。The key to be added or whose value should be updated

addValueFactory
Func<TKey,TValue>

用來為不存在的索引鍵產生值的函式。The function used to generate a value for an absent key

updateValueFactory
Func<TKey,TValue,TValue>

函式,用來根據索引鍵的現有值為現有索引鍵產生新值。The function used to generate a new value for an existing key based on the key's existing value

傳回

TValue TValue TValue TValue

索引鍵的新值。The new value for the key. 這個值會是 addValueFactory (如果索引鍵不存在) 的結果或 updateValueFactory (如果索引鍵存在) 的結果。This will be either be the result of addValueFactory (if the key was absent) or the result of updateValueFactory (if the key was present).

例外狀況

keyaddValueFactoryupdateValueFactorynullkey, addValueFactory, or updateValueFactory is null.

字典已經包含項目數目上限 (MaxValue)。The dictionary already contains the maximum number of elements (MaxValue).

備註

如果您呼叫AddOrUpdate同時在不同的執行緒上addValueFactory可呼叫多次,但是其索引鍵/值組可能不會新增至每個呼叫的字典。If you call AddOrUpdate simultaneously on different threads, addValueFactory may be called multiple times, but its key/value pair might not be added to the dictionary for every call.

修改,以及寫入至字典中,作業ConcurrentDictionary<TKey,TValue>使用更細緻的鎖定以確保執行緒安全性。For modifications and write operations to the dictionary, ConcurrentDictionary<TKey,TValue> uses fine-grained locking to ensure thread safety. (在字典上的讀取作業會在無鎖定的方式執行)。不過,addValueFactoryupdateValueFactory外部的鎖定,以避免發生的問題,可以從執行不明的程式碼,在鎖定下呼叫委派。(Read operations on the dictionary are performed in a lock-free manner.) However, the addValueFactory and updateValueFactory delegates are called outside the locks to avoid the problems that can arise from executing unknown code under a lock. 因此,AddOrUpdate不是關於所有其他作業的不可部分完成ConcurrentDictionary<TKey,TValue>類別。Therefore, AddOrUpdate is not atomic with regards to all other operations on the ConcurrentDictionary<TKey,TValue> class.

另請參閱

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

如果索引鍵不存在,則將索引鍵/值組加入 ConcurrentDictionary<TKey,TValue>;如果索引鍵已經存在,則使用指定的函式更新 ConcurrentDictionary<TKey,TValue> 中的索引鍵/值組。Adds a key/value pair to the ConcurrentDictionary<TKey,TValue> if the key does not already exist, or updates a key/value pair in the ConcurrentDictionary<TKey,TValue> by using the specified function if the key already exists.

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

參數

key
TKey TKey TKey TKey

要加入或應該更新其值的索引鍵。The key to be added or whose value should be updated

addValue
TValue TValue TValue TValue

要為不存在的索引鍵加入的值。The value to be added for an absent key

updateValueFactory
Func<TKey,TValue,TValue>

函式,用來根據索引鍵的現有值為現有索引鍵產生新值。The function used to generate a new value for an existing key based on the key's existing value

傳回

TValue TValue TValue TValue

索引鍵的新值。The new value for the key. 這個值會是 addValue (如果索引鍵不存在) 或 updateValueFactory (如果索引鍵存在) 的結果。This will be either be addValue (if the key was absent) or the result of updateValueFactory (if the key was present).

例外狀況

keyupdateValueFactorynullkey or updateValueFactory is null.

字典已經包含項目數目上限 (MaxValue)。The dictionary already contains the maximum number of elements (MaxValue).

範例

下列程式碼範例示範如何初始化ConcurrentDictionary<TKey,TValue>,以及如何使用 AddOrUpdate 方法來新增額外的項目加入集合中,並更新現有的項目。The following code example shows how to initialize an ConcurrentDictionary<TKey,TValue> and how to use the AddOrUpdate method to add an additional item to the collection, and update the existing items.

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

修改,以及寫入至字典中,作業ConcurrentDictionary<TKey,TValue>使用更細緻的鎖定以確保執行緒安全性。For modifications and write operations to the dictionary, ConcurrentDictionary<TKey,TValue> uses fine-grained locking to ensure thread safety. (在字典上的讀取作業會在無鎖定的方式執行)。不過,updateValueFactory之外的鎖定,以避免發生的問題,可以從執行不明的程式碼,在鎖定下呼叫委派。(Read operations on the dictionary are performed in a lock-free manner.) However, the updateValueFactory delegate is called outside the locks to avoid the problems that can arise from executing unknown code under a lock. 因此,AddOrUpdate不是關於所有其他作業的不可部分完成ConcurrentDictionary<TKey,TValue>類別。Therefore, AddOrUpdate is not atomic with regards to all other operations on the ConcurrentDictionary<TKey,TValue> class.

另請參閱

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

若機碼不存在,使用指定的函式與引數將機碼/值組新增到 ConcurrentDictionary<TKey,TValue>,或若機碼存在,更新 ConcurrentDictionary<TKey,TValue> 中的機碼/值組。Uses the specified functions and argument to add a key/value pair to the ConcurrentDictionary<TKey,TValue> if the key does not already exist, or to update a key/value pair in the ConcurrentDictionary<TKey,TValue> if the key already exists.

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

類型參數

TArg

將傳入的引數的型別addValueFactoryupdateValueFactoryThe type of an argument to pass into addValueFactory and updateValueFactory.

參數

key
TKey TKey TKey TKey

要新增或應該更新其值的索引鍵。The key to be added or whose value should be updated.

addValueFactory
Func<TKey,TArg,TValue>

用來為不存在之索引鍵產生值的函式。The function used to generate a value for an absent key.

updateValueFactory
Func<TKey,TValue,TArg,TValue>

用來根據索引鍵之現有值為現有索引鍵產生新值的函式。The function used to generate a new value for an existing key based on the key's existing value.

factoryArgument

要傳入 addValueFactoryupdateValueFactory 的引數。An argument to pass into addValueFactory and updateValueFactory.

傳回

TValue TValue TValue TValue

索引鍵的新值。The new value for the key. 這個值會是 addValueFactory (如果索引鍵不存在) 的結果或 updateValueFactory (如果索引鍵存在) 的結果。This will be either be the result of addValueFactory (if the key was absent) or the result of updateValueFactory (if the key was present).

例外狀況

keyaddValueFactoryupdateValueFactory 為 Null 參考 (在 Visual Basic 中為 Nothing)。key, addValueFactory, or updateValueFactory is a null reference (Nothing in Visual Basic).

字典包含太多的項目。The dictionary contains too many elements.

備註

如果您呼叫AddOrUpdate同時在不同的執行緒上addValueFactory可呼叫多次,但是其索引鍵/值組可能不會新增至每個呼叫的字典。If you call AddOrUpdate simultaneously on different threads, addValueFactory may be called multiple times, but its key/value pair might not be added to the dictionary for every call.

修改,以及寫入至字典中,作業ConcurrentDictionary<TKey,TValue>使用更細緻的鎖定以確保執行緒安全性。For modifications and write operations to the dictionary, ConcurrentDictionary<TKey,TValue> uses fine-grained locking to ensure thread safety. (在字典上的讀取作業會在無鎖定的方式執行)。不過,addValueFactoryupdateValueFactory外部的鎖定,以避免發生的問題,可以從執行不明的程式碼,在鎖定下呼叫委派。(Read operations on the dictionary are performed in a lock-free manner.) However, the addValueFactory and updateValueFactory delegates are called outside the locks to avoid the problems that can arise from executing unknown code under a lock. 因此,AddOrUpdate不是關於所有其他作業的不可部分完成ConcurrentDictionary<TKey,TValue>類別。Therefore, AddOrUpdate is not atomic with regards to all other operations on the ConcurrentDictionary<TKey,TValue> class.

適用於