Bagikan melalui


ConcurrentDictionary<TKey,TValue>.GetOrAdd Metode

Definisi

Menambahkan pasangan kunci/nilai ke ConcurrentDictionary<TKey,TValue> jika kunci belum ada. Mengembalikan nilai baru, atau nilai yang sudah ada jika kunci sudah ada.

Overload

GetOrAdd(TKey, Func<TKey,TValue>)

Menambahkan pasangan kunci/nilai ke ConcurrentDictionary<TKey,TValue> dengan menggunakan fungsi yang ditentukan jika kunci belum ada. Mengembalikan nilai baru, atau nilai yang sudah ada jika kunci ada.

GetOrAdd(TKey, TValue)

Menambahkan pasangan kunci/nilai ke ConcurrentDictionary<TKey,TValue> jika kunci belum ada. Mengembalikan nilai baru, atau nilai yang sudah ada jika kunci ada.

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

Menambahkan pasangan kunci/nilai ke ConcurrentDictionary<TKey,TValue> dengan menggunakan fungsi yang ditentukan dan argumen jika kunci belum ada, atau mengembalikan nilai yang ada jika kunci ada.

Contoh

Contoh berikut menunjukkan cara memanggil GetOrAdd metode :

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

Sumber:
ConcurrentDictionary.cs
Sumber:
ConcurrentDictionary.cs
Sumber:
ConcurrentDictionary.cs

Menambahkan pasangan kunci/nilai ke ConcurrentDictionary<TKey,TValue> dengan menggunakan fungsi yang ditentukan jika kunci belum ada. Mengembalikan nilai baru, atau nilai yang sudah ada jika kunci ada.

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

Parameter

key
TKey

Kunci elemen yang akan ditambahkan.

valueFactory
Func<TKey,TValue>

Fungsi yang digunakan untuk menghasilkan nilai untuk kunci.

Mengembalikan

TValue

Nilai untuk kunci. Ini akan menjadi nilai yang ada untuk kunci jika kunci sudah ada di kamus, atau nilai baru jika kunci tidak ada dalam kamus.

Pengecualian

key atau valueFactory adalah null.

Kamus berisi terlalu banyak elemen.

Keterangan

Untuk modifikasi dan operasi tulis pada kamus, ConcurrentDictionary<TKey,TValue> gunakan penguncian halus untuk memastikan keamanan utas. (Operasi baca pada kamus dilakukan dengan cara bebas kunci.) Namun, valueFactory delegasi dipanggil di luar kunci untuk menghindari masalah yang dapat timbul dari mengeksekusi kode yang tidak diketahui di bawah kunci. Oleh karena itu, GetOrAdd tidak atom sehubungan dengan semua operasi lain di ConcurrentDictionary<TKey,TValue> kelas .

Karena kunci/nilai dapat dimasukkan oleh utas lain saat valueFactory menghasilkan nilai, Anda tidak dapat mempercayainya hanya karena valueFactory dijalankan, nilai yang dihasilkan akan dimasukkan ke dalam kamus dan dikembalikan. Jika Anda memanggil GetOrAdd secara bersamaan pada utas yang berbeda, valueFactory dapat dipanggil beberapa kali, tetapi hanya satu pasangan kunci/nilai yang akan ditambahkan ke kamus.

Nilai yang dikembalikan tergantung pada keberadaan kunci dalam kamus dan apakah kunci/nilai disisipkan oleh utas lain setelah GetOrAdd dipanggil tetapi sebelum valueFactory menghasilkan nilai:

Skenario Nilai kembali
Kunci sudah ada di kamus. Nilai yang ada dikembalikan.
Kunci tidak ada dalam kamus. valueFactory menghasilkan nilai. Pada pemeriksaan ulang untuk kunci, tidak ada kunci yang ditemukan. Kunci/nilai dimasukkan ke dalam kamus, dan nilai dikembalikan.
Kunci tidak ada dalam kamus. valueFactory menghasilkan nilai. Saat valueFactory menghasilkan nilai, utas yang berbeda menyisipkan nilai untuk kunci. Setelah valueFactory dijalankan dan setelah memeriksa ulang kunci, kunci yang dimasukkan oleh utas lain ditemukan. Nilai yang disisipkan oleh utas lain dikembalikan.

Lihat juga

Berlaku untuk

GetOrAdd(TKey, TValue)

Sumber:
ConcurrentDictionary.cs
Sumber:
ConcurrentDictionary.cs
Sumber:
ConcurrentDictionary.cs

Menambahkan pasangan kunci/nilai ke ConcurrentDictionary<TKey,TValue> jika kunci belum ada. Mengembalikan nilai baru, atau nilai yang sudah ada jika kunci ada.

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

Parameter

key
TKey

Kunci elemen yang akan ditambahkan.

value
TValue

Nilai yang akan ditambahkan, jika kunci belum ada.

Mengembalikan

TValue

Nilai untuk kunci. Ini akan menjadi nilai yang ada untuk kunci jika kunci sudah ada di kamus, atau nilai baru jika kunci tidak ada dalam kamus.

Pengecualian

keyadalah null.

Kamus berisi terlalu banyak elemen.

Lihat juga

Berlaku untuk

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

Sumber:
ConcurrentDictionary.cs
Sumber:
ConcurrentDictionary.cs
Sumber:
ConcurrentDictionary.cs

Menambahkan pasangan kunci/nilai ke ConcurrentDictionary<TKey,TValue> dengan menggunakan fungsi yang ditentukan dan argumen jika kunci belum ada, atau mengembalikan nilai yang ada jika kunci ada.

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

Jenis parameter

TArg

Jenis argumen yang akan diteruskan ke valueFactory.

Parameter

key
TKey

Kunci elemen yang akan ditambahkan.

valueFactory
Func<TKey,TArg,TValue>

Fungsi yang digunakan untuk menghasilkan nilai untuk kunci.

factoryArgument
TArg

Nilai argumen untuk diteruskan ke valueFactory.

Mengembalikan

TValue

Nilai untuk kunci. Ini akan menjadi nilai yang ada untuk kunci jika kunci sudah ada di kamus, atau nilai baru jika kunci tidak ada dalam kamus.

Pengecualian

key adalah null referensi (Tidak ada di Visual Basic).

Kamus berisi terlalu banyak elemen.

Keterangan

Untuk modifikasi dan operasi tulis pada kamus, ConcurrentDictionary<TKey,TValue> gunakan penguncian halus untuk memastikan keamanan utas. (Operasi baca pada kamus dilakukan dengan cara bebas kunci.) Namun, valueFactory delegasi dipanggil di luar kunci untuk menghindari masalah yang dapat timbul dari mengeksekusi kode yang tidak diketahui di bawah kunci. Oleh karena itu, GetOrAdd tidak atom sehubungan dengan semua operasi lain di ConcurrentDictionary<TKey,TValue> kelas .

Karena kunci/nilai dapat dimasukkan oleh utas lain saat valueFactory menghasilkan nilai, Anda tidak dapat mempercayainya hanya karena valueFactory dijalankan, nilai yang dihasilkan akan dimasukkan ke dalam kamus dan dikembalikan. Jika Anda memanggil GetOrAdd secara bersamaan pada utas yang berbeda, valueFactory dapat dipanggil beberapa kali, tetapi hanya satu pasangan kunci/nilai yang akan ditambahkan ke kamus.

Nilai yang dikembalikan tergantung pada keberadaan kunci dalam kamus dan apakah kunci/nilai disisipkan oleh utas lain setelah GetOrAdd dipanggil tetapi sebelum valueFactory menghasilkan nilai:

Skenario Nilai kembali
Kunci sudah ada di kamus. Nilai yang ada dikembalikan.
Kunci tidak ada dalam kamus. valueFactory menghasilkan nilai. Pada pemeriksaan ulang untuk kunci, tidak ada kunci yang ditemukan. Kunci/nilai dimasukkan ke dalam kamus, dan nilai dikembalikan.
Kunci tidak ada dalam kamus. valueFactory menghasilkan nilai. Saat valueFactory menghasilkan nilai, utas yang berbeda menyisipkan nilai untuk kunci. Setelah valueFactory dijalankan dan setelah memeriksa ulang kunci, kunci yang dimasukkan oleh utas lain ditemukan. Nilai yang disisipkan oleh utas lain dikembalikan.

Berlaku untuk