ConcurrentDictionary<TKey,TValue>.GetOrAdd Yöntem

Tanım

Anahtar yoksa öğesine bir anahtar/değer çifti ConcurrentDictionary<TKey,TValue> ekler. Yeni değeri veya anahtar zaten varsa var olan değeri döndürür.

Aşırı Yüklemeler

GetOrAdd(TKey, Func<TKey,TValue>)

Anahtar zaten yoksa belirtilen işlevi kullanarak öğesine bir anahtar/değer çifti ConcurrentDictionary<TKey,TValue> ekler. Yeni değeri veya anahtar varsa var olan değeri döndürür.

GetOrAdd(TKey, TValue)

Anahtar yoksa öğesine bir anahtar/değer çifti ConcurrentDictionary<TKey,TValue> ekler. Yeni değeri veya anahtar varsa var olan değeri döndürür.

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

Belirtilen işlevi kullanarak öğesine bir anahtar/değer çifti ConcurrentDictionary<TKey,TValue> ve anahtar yoksa bir bağımsız değişken ekler veya anahtar varsa mevcut değeri döndürür.

Örnekler

Aşağıdaki örnekte yönteminin nasıl çağrılacakları gösterilmektedir GetOrAdd :

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

Kaynak:
ConcurrentDictionary.cs
Kaynak:
ConcurrentDictionary.cs
Kaynak:
ConcurrentDictionary.cs

Anahtar zaten yoksa belirtilen işlevi kullanarak öğesine bir anahtar/değer çifti ConcurrentDictionary<TKey,TValue> ekler. Yeni değeri veya anahtar varsa var olan değeri döndürür.

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

Parametreler

key
TKey

Eklenecek öğenin anahtarı.

valueFactory
Func<TKey,TValue>

Anahtar için bir değer oluşturmak için kullanılan işlev.

Döndürülenler

TValue

Anahtarın değeri. Bu, anahtar zaten sözlükteyse anahtarın mevcut değeri veya anahtar sözlükte değilse yeni değer olacaktır.

Özel durumlar

key veya valueFactory şeklindedir null.

Sözlük çok fazla öğe içeriyor.

Açıklamalar

Sözlükte yapılan değişiklikler ve yazma işlemleri için, ConcurrentDictionary<TKey,TValue> iş parçacığı güvenliğini sağlamak için ayrıntılı kilitleme kullanır. (Sözlükteki okuma işlemleri kilitsiz bir şekilde gerçekleştirilir.) Ancak, valueFactory bilinmeyen kodun bir kilit altında yürütülmesinden kaynaklanabilecek sorunları önlemek için temsilci kilitlerin dışında çağrılır. Bu nedenle, GetOrAdd sınıfındaki ConcurrentDictionary<TKey,TValue> diğer tüm işlemler açısından atomik değildir.

Bir değer oluşturulurken valueFactory anahtar/değer başka bir iş parçacığı tarafından eklenebildiği için, yalnızca yürütüldükten sonra valueFactory üretilen değerin sözlüğe eklenip döndürüleceği konusunda güvenemezsiniz. Farklı iş parçacıklarında aynı anda çağırırsanız GetOrAdd , valueFactory birden çok kez çağrılabilir, ancak sözlüğe yalnızca bir anahtar/değer çifti eklenir.

Dönüş değeri, anahtarın sözlükte varlığına ve bir anahtarın/değerin başka bir iş parçacığı tarafından çağrıldıktan sonra GetOrAdd ancak bir değer oluşturmadan önce valueFactory eklenip eklenmediğine bağlıdır:

Senaryo Döndürülen değer
Anahtar zaten sözlüktedir. Mevcut değer döndürülür.
Anahtar sözlükte değil. valueFactory bir değer oluşturur. Anahtarı yeniden denetleyildiğinde hiçbir anahtar bulunamadı. Anahtar/değer sözlüğe eklenir ve değer döndürülür.
Anahtar sözlükte değil. valueFactory bir değer oluşturur. Değeri oluştururken valueFactory farklı bir iş parçacığı anahtar için bir değer ekler. Yürütülür ve anahtar için yeniden denetlendikten sonra valueFactory , diğer iş parçacığı tarafından eklenen anahtar bulunur. Diğer iş parçacığı tarafından eklenen değer döndürülür.

Ayrıca bkz.

Şunlara uygulanır

GetOrAdd(TKey, TValue)

Kaynak:
ConcurrentDictionary.cs
Kaynak:
ConcurrentDictionary.cs
Kaynak:
ConcurrentDictionary.cs

Anahtar yoksa öğesine bir anahtar/değer çifti ConcurrentDictionary<TKey,TValue> ekler. Yeni değeri veya anahtar varsa var olan değeri döndürür.

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

Parametreler

key
TKey

Eklenecek öğenin anahtarı.

value
TValue

Anahtar zaten yoksa eklenecek değer.

Döndürülenler

TValue

Anahtarın değeri. Bu, anahtar zaten sözlükteyse anahtarın mevcut değeri veya anahtar sözlükte değilse yeni değer olacaktır.

Özel durumlar

key, null değeridir.

Sözlük çok fazla öğe içeriyor.

Ayrıca bkz.

Şunlara uygulanır

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

Kaynak:
ConcurrentDictionary.cs
Kaynak:
ConcurrentDictionary.cs
Kaynak:
ConcurrentDictionary.cs

Belirtilen işlevi kullanarak öğesine bir anahtar/değer çifti ConcurrentDictionary<TKey,TValue> ve anahtar yoksa bir bağımsız değişken ekler veya anahtar varsa mevcut değeri döndürür.

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

Tür Parametreleri

TArg

içine geçirecek valueFactorybağımsız değişkenin türü.

Parametreler

key
TKey

Eklenecek öğenin anahtarı.

valueFactory
Func<TKey,TArg,TValue>

Anahtar için bir değer oluşturmak için kullanılan işlev.

factoryArgument
TArg

içine valueFactorygeçirecek bir bağımsız değişken değeri.

Döndürülenler

TValue

Anahtarın değeri. Bu, anahtar zaten sözlükteyse anahtarın mevcut değeri veya anahtar sözlükte değilse yeni değer olacaktır.

Özel durumlar

key bir null başvurudur (Visual Basic'te hiçbir şey).

Sözlük çok fazla öğe içeriyor.

Açıklamalar

Sözlükte yapılan değişiklikler ve yazma işlemleri için, ConcurrentDictionary<TKey,TValue> iş parçacığı güvenliğini sağlamak için ayrıntılı kilitleme kullanır. (Sözlükteki okuma işlemleri kilitsiz bir şekilde gerçekleştirilir.) Ancak, valueFactory bilinmeyen kodun bir kilit altında yürütülmesinden kaynaklanabilecek sorunları önlemek için temsilci kilitlerin dışında çağrılır. Bu nedenle, GetOrAdd sınıfındaki ConcurrentDictionary<TKey,TValue> diğer tüm işlemler açısından atomik değildir.

Bir değer oluşturulurken valueFactory anahtar/değer başka bir iş parçacığı tarafından eklenebildiği için, yalnızca yürütüldükten sonra valueFactory üretilen değerin sözlüğe eklenip döndürüleceği konusunda güvenemezsiniz. Farklı iş parçacıklarında aynı anda çağırırsanız GetOrAdd , valueFactory birden çok kez çağrılabilir, ancak sözlüğe yalnızca bir anahtar/değer çifti eklenir.

Dönüş değeri, anahtarın sözlükte varlığına ve bir anahtarın/değerin başka bir iş parçacığı tarafından çağrıldıktan sonra GetOrAdd ancak bir değer oluşturmadan önce valueFactory eklenip eklenmediğine bağlıdır:

Senaryo Döndürülen değer
Anahtar zaten sözlüktedir. Mevcut değer döndürülür.
Anahtar sözlükte değil. valueFactory bir değer oluşturur. Anahtarı yeniden denetleyildiğinde hiçbir anahtar bulunamadı. Anahtar/değer sözlüğe eklenir ve değer döndürülür.
Anahtar sözlükte değil. valueFactory bir değer oluşturur. Değeri oluştururken valueFactory farklı bir iş parçacığı anahtar için bir değer ekler. Yürütülür ve anahtar için yeniden denetlendikten sonra valueFactory , diğer iş parçacığı tarafından eklenen anahtar bulunur. Diğer iş parçacığı tarafından eklenen değer döndürülür.

Şunlara uygulanır