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

定義

キーがまだ存在しない場合に、ConcurrentDictionary<TKey,TValue> にキーと値のペアを追加します。Adds a key/value pair to the ConcurrentDictionary<TKey,TValue> if the key does not already exist. 新しい値、または既にキーが存在する場合は既存の値を返します。Returns the new value, or the existing value if the key already exists.

オーバーロード

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

キーがまだ存在しない場合に、指定された関数を使用して ConcurrentDictionary<TKey,TValue> にキーと値のペアを追加します。Adds a key/value pair to the ConcurrentDictionary<TKey,TValue> by using the specified function if the key does not already exist. 新しい値、またはキーが存在する場合は既存の値を返します。Returns the new value, or the existing value if the key exists.

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

キーがまだ存在しない場合に、ConcurrentDictionary<TKey,TValue> にキーと値のペアを追加します。Adds a key/value pair to the ConcurrentDictionary<TKey,TValue> if the key does not already exist. 新しい値、またはキーが存在する場合は既存の値を返します。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)

キーがまだ存在しない場合は、指定された関数と引数を使用して ConcurrentDictionary<TKey,TValue> にキーと値のペアを追加し、キーが存在する場合は既存の値を返します。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.

次の例を呼び出す方法を示しています、GetOrAddメソッド。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>)

キーがまだ存在しない場合に、指定された関数を使用して ConcurrentDictionary<TKey,TValue> にキーと値のペアを追加します。Adds a key/value pair to the ConcurrentDictionary<TKey,TValue> by using the specified function if the key does not already exist. 新しい値、またはキーが存在する場合は既存の値を返します。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

パラメーター

key
TKey TKey TKey TKey

追加する要素のキー。The key of the element to add.

valueFactory
Func<TKey,TValue>

キーの値を生成するために使用される関数。The function used to generate a value for the key.

戻り値

TValue TValue TValue TValue

キーの値。The value for the key. キーがディクショナリに既に存在する場合はキーの既存の値、キーがディクショナリに存在していなかった場合は新しい値になります。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.

例外

key または valueFactorynull です。key or valueFactory is null.

ディクショナリには、既に要素の最大数 (MaxValue) が含まれています。The dictionary already contains the maximum number of elements (MaxValue).

注釈

変更と、ディクショナリへの書き込み操作のConcurrentDictionary<TKey,TValue>細かいロックを使用して、スレッド セーフを確保します。For modifications and write operations to the dictionary, ConcurrentDictionary<TKey,TValue> uses fine-grained locking to ensure thread safety. (ディクショナリに対する読み取り操作はロック制御不要の方法で実行されます)。ただし、valueFactory不明なロック コードを実行から生じる可能性のある問題を回避するロックの外側にデリゲートが呼び出されます。(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. そのため、GetOrAddの他のすべての操作に関してはアトミックではない、ConcurrentDictionary<TKey,TValue>クラス。Therefore, GetOrAdd is not atomic with regards to all other operations on the ConcurrentDictionary<TKey,TValue> class.

中に別のスレッドによって、キー/値を挿入することができますのでvalueFactoryが値を生成することはできません信頼できるからといってvalueFactory実行すると、その生成された値のディクショナリに挿入され、返されます。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. 呼び出す場合GetOrAddさまざまなスレッドで同時にvalueFactory呼び出すことができますが、複数回、1 つだけのキー/値ペアをディクショナリに追加されます。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.

戻り値が後に別のスレッドによって、キー/値を挿入するかどうかの辞書にキーの存在に依存GetOrAddする前と呼ばれるvalueFactory値を生成します。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:

シナリオScenario 戻り値Return value
キーは既に辞書に。The key is already in the dictionary. 既存の値が返されます。The existing value is returned.
キーは、ディクショナリ内ではありません。The key is not in the dictionary. valueFactory 値を生成します。valueFactory generates a value. キーの再確認をでキーが見つかりません。On rechecking for the key, no key is found. キー/値は、ディクショナリに挿入され、値が返されます。The key/value is inserted into the dictionary, and the value is returned.
キーは、ディクショナリ内ではありません。The key is not in the dictionary. valueFactory 値を生成します。valueFactory generates a value. 中にvalueFactoryが別のスレッドの値を生成するには、キーの値を挿入します。While valueFactory is generating the value, a different thread inserts a value for the key. valueFactoryを実行し、その他のスレッドによって挿入されたキーが見つかったキーの再確認、時にします。After valueFactory executes and upon rechecking for the key, the key inserted by the other thread is found. 他のスレッドによって挿入された値が返されます。The value inserted by the other thread is returned.
こちらもご覧ください

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

キーがまだ存在しない場合に、ConcurrentDictionary<TKey,TValue> にキーと値のペアを追加します。Adds a key/value pair to the ConcurrentDictionary<TKey,TValue> if the key does not already exist. 新しい値、またはキーが存在する場合は既存の値を返します。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

パラメーター

key
TKey TKey TKey TKey

追加する要素のキー。The key of the element to add.

value
TValue TValue TValue TValue

キーがまだ存在しない場合に追加する値。The value to be added, if the key does not already exist.

戻り値

TValue TValue TValue TValue

キーの値。The value for the key. キーがディクショナリに既に存在する場合はキーの既存の値、キーがディクショナリに存在していなかった場合は新しい値になります。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.

例外

ディクショナリには、既に要素の最大数 (MaxValue) が含まれています。The dictionary already contains the maximum number of elements (MaxValue).

こちらもご覧ください

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)

キーがまだ存在しない場合は、指定された関数と引数を使用して ConcurrentDictionary<TKey,TValue> にキーと値のペアを追加し、キーが存在する場合は既存の値を返します。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

型パラメーター

TArg

渡す引数の型valueFactoryします。The type of an argument to pass into valueFactory.

パラメーター

key
TKey TKey TKey TKey

追加する要素のキー。The key of the element to add.

valueFactory
Func<TKey,TArg,TValue>

キーの値を生成するために使用される関数。The function used to generate a value for the key.

factoryArgument

valueFactory に渡す引数値。An argument value to pass into valueFactory.

戻り値

TValue TValue TValue TValue

キーの値。The value for the key. キーがディクショナリに既に存在する場合はキーの既存の値、キーがディクショナリに存在していなかった場合は新しい値になります。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.

例外

key null参照 (Visual Basic では Nothing) です。key is a null reference (Nothing in Visual Basic).

ディクショナリに含まれる要素が多すぎます。The dictionary contains too many elements.

注釈

変更と、ディクショナリへの書き込み操作のConcurrentDictionary<TKey,TValue>細かいロックを使用して、スレッド セーフを確保します。For modifications and write operations to the dictionary, ConcurrentDictionary<TKey,TValue> uses fine-grained locking to ensure thread safety. (ディクショナリに対する読み取り操作はロック制御不要の方法で実行されます)。ただし、valueFactory不明なロック コードを実行から生じる可能性のある問題を回避するロックの外側にデリゲートが呼び出されます。(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. そのため、GetOrAddの他のすべての操作に関してはアトミックではない、ConcurrentDictionary<TKey,TValue>クラス。Therefore, GetOrAdd is not atomic with regards to all other operations on the ConcurrentDictionary<TKey,TValue> class.

中に別のスレッドによって、キー/値を挿入することができますのでvalueFactoryが値を生成することはできません信頼できるからといってvalueFactory実行すると、その生成された値のディクショナリに挿入され、返されます。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. 呼び出す場合GetOrAddさまざまなスレッドで同時にvalueFactory呼び出すことができますが、複数回、1 つだけのキー/値ペアをディクショナリに追加されます。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.

戻り値が後に別のスレッドによって、キー/値を挿入するかどうかの辞書にキーの存在に依存GetOrAddする前と呼ばれるvalueFactory値を生成します。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:

シナリオScenario 戻り値Return value
キーは既に辞書に。The key is already in the dictionary. 既存の値が返されます。The existing value is returned.
キーは、ディクショナリ内ではありません。The key is not in the dictionary. valueFactory 値を生成します。valueFactory generates a value. キーの再確認をでキーが見つかりません。On rechecking for the key, no key is found. キー/値は、ディクショナリに挿入され、値が返されます。The key/value is inserted into the dictionary, and the value is returned.
キーは、ディクショナリ内ではありません。The key is not in the dictionary. valueFactory 値を生成します。valueFactory generates a value. 中にvalueFactoryが別のスレッドの値を生成するには、キーの値を挿入します。While valueFactory is generating the value, a different thread inserts a value for the key. valueFactoryを実行し、その他のスレッドによって挿入されたキーが見つかったキーの再確認、時にします。After valueFactory executes and upon rechecking for the key, the key inserted by the other thread is found. 他のスレッドによって挿入された値が返されます。The value inserted by the other thread is returned.

適用対象