ConcurrentDictionary<TKey,TValue>.GetOrAdd Yöntem
Tanım
Önemli
Bazı bilgiler ürünün ön sürümüyle ilgilidir ve sürüm öncesinde önemli değişiklikler yapılmış olabilir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.
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
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.
- İş Parçacığı Güvenli Koleksiyonlar
- Nasıl yapılır: Öğeleri Ekleme ve Bir ConcurrentDictionary'den Alma
Ş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
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.
- İş Parçacığı Güvenli Koleksiyonlar
- Nasıl yapılır: Öğeleri Ekleme ve Bir ConcurrentDictionary'den Alma
Ş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 valueFactory
bağı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 valueFactory
geçirecek bir bağımsız değişken değeri.
Döndürülenler
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. |