ConcurrentDictionary<TKey,TValue>.GetOrAdd メソッド

定義

キーがまだ存在しない場合に、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>)

キーがまだ存在しない場合に、指定された関数を使用して 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)

キーがまだ存在しない場合に、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)

キーがまだ存在しない場合は、指定された関数と引数を使用して 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>)

キーがまだ存在しない場合に、指定された関数を使用して 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

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

valueFactory
Func<TKey,TValue>

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

戻り値

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. は、キーの実行時とノート時に、もう一方のスレッドによって挿入されたキーを検索します。valueFactoryAfter 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)

キーがまだ存在しない場合に、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

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

value
TValue

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

戻り値

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.

例外

keynullです。key is null.

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

こちらもご覧ください

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

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

valueFactory
Func<TKey,TArg,TValue>

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

factoryArgument
TArg

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

戻り値

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.

例外

keynull 参照 (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. は、キーの実行時とノート時に、もう一方のスレッドによって挿入されたキーを検索します。valueFactoryAfter 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.

適用対象