ConcurrentDictionary<TKey,TValue>.GetOrAdd Metode
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
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
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
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
.
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
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. |