ConcurrentDictionary<TKey,TValue>.AddOrUpdate Método
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Agrega un par clave-valor a ConcurrentDictionary<TKey,TValue> si la clave no existe o actualiza un par clave-valor de ConcurrentDictionary<TKey,TValue> si la clave ya existe.
Sobrecargas
AddOrUpdate(TKey, Func<TKey,TValue>, Func<TKey,TValue,TValue>) |
Utiliza las funciones especificadas para agregar un par clave-valor a ConcurrentDictionary<TKey,TValue> si la clave no existe o para actualizar un par clave-valor de ConcurrentDictionary<TKey,TValue> si la clave ya existe. |
AddOrUpdate(TKey, TValue, Func<TKey,TValue,TValue>) |
Agrega un par clave-valor a ConcurrentDictionary<TKey,TValue> si la clave no existe o actualiza un par clave-valor de ConcurrentDictionary<TKey,TValue> utilizando la función especificada, si la clave ya existe. |
AddOrUpdate<TArg>(TKey, Func<TKey,TArg,TValue>, Func<TKey,TValue,TArg,TValue>, TArg) |
Utiliza las funciones especificadas y un argumento para agregar un par clave-valor a ConcurrentDictionary<TKey,TValue> si la clave no existe o para actualizar un par clave-valor de ConcurrentDictionary<TKey,TValue> si la clave ya existe. |
Ejemplos
En el ejemplo siguiente se muestra cómo llamar al AddOrUpdate método :
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
AddOrUpdate(TKey, Func<TKey,TValue>, Func<TKey,TValue,TValue>)
- Source:
- ConcurrentDictionary.cs
- Source:
- ConcurrentDictionary.cs
- Source:
- ConcurrentDictionary.cs
Utiliza las funciones especificadas para agregar un par clave-valor a ConcurrentDictionary<TKey,TValue> si la clave no existe o para actualizar un par clave-valor de ConcurrentDictionary<TKey,TValue> si la clave ya existe.
public:
TValue AddOrUpdate(TKey key, Func<TKey, TValue> ^ addValueFactory, Func<TKey, TValue, TValue> ^ updateValueFactory);
public TValue AddOrUpdate (TKey key, Func<TKey,TValue> addValueFactory, Func<TKey,TValue,TValue> updateValueFactory);
member this.AddOrUpdate : 'Key * Func<'Key, 'Value> * Func<'Key, 'Value, 'Value> -> 'Value
Public Function AddOrUpdate (key As TKey, addValueFactory As Func(Of TKey, TValue), updateValueFactory As Func(Of TKey, TValue, TValue)) As TValue
Parámetros
- key
- TKey
Clave que se va a agregar o cuyo valor se va a actualizar.
- addValueFactory
- Func<TKey,TValue>
Función que se usa para generar un valor para una clave ausente.
- updateValueFactory
- Func<TKey,TValue,TValue>
Función que se usa para generar un nuevo valor para una clave existente basándose en el valor existente de la clave.
Devoluciones
Nuevo valor de la clave. Este será el resultado de addValueFactory
(si la clave no se encontró) o el de updateValueFactory
(si la clave se encontró).
Excepciones
key
, addValueFactory
o updateValueFactory
es null
.
El diccionario contiene demasiados elementos.
Comentarios
Si llama AddOrUpdate simultáneamente a en subprocesos diferentes, addValueFactory
se puede llamar varias veces, pero es posible que su par clave-valor no se agregue al diccionario para cada llamada.
Para las modificaciones y las operaciones de escritura en el diccionario, ConcurrentDictionary<TKey,TValue> usa el bloqueo específico para garantizar la seguridad de los subprocesos (las operaciones de lectura en el diccionario se realizan de forma sin bloqueos). Los addValueFactory
delegados y updateValueFactory
se pueden ejecutar varias veces para comprobar que el valor se agregó o actualizó según lo previsto. Sin embargo, se llama fuera de los bloqueos para evitar los problemas que pueden surgir al ejecutar código desconocido bajo un bloqueo. Por lo tanto, AddOrUpdate no es atómica con respecto a todas las demás operaciones de la ConcurrentDictionary<TKey,TValue> clase .
Consulte también
Se aplica a
AddOrUpdate(TKey, TValue, Func<TKey,TValue,TValue>)
- Source:
- ConcurrentDictionary.cs
- Source:
- ConcurrentDictionary.cs
- Source:
- ConcurrentDictionary.cs
Agrega un par clave-valor a ConcurrentDictionary<TKey,TValue> si la clave no existe o actualiza un par clave-valor de ConcurrentDictionary<TKey,TValue> utilizando la función especificada, si la clave ya existe.
public:
TValue AddOrUpdate(TKey key, TValue addValue, Func<TKey, TValue, TValue> ^ updateValueFactory);
public TValue AddOrUpdate (TKey key, TValue addValue, Func<TKey,TValue,TValue> updateValueFactory);
member this.AddOrUpdate : 'Key * 'Value * Func<'Key, 'Value, 'Value> -> 'Value
Public Function AddOrUpdate (key As TKey, addValue As TValue, updateValueFactory As Func(Of TKey, TValue, TValue)) As TValue
Parámetros
- key
- TKey
Clave que se va a agregar o cuyo valor se va a actualizar.
- addValue
- TValue
Valor que se va a agregar para una clave ausente.
- updateValueFactory
- Func<TKey,TValue,TValue>
Función que se usa para generar un nuevo valor para una clave existente basándose en el valor existente de la clave.
Devoluciones
Nuevo valor de la clave. Este será addValue
(si la clave no se encontró) o el resultado de updateValueFactory
(si la clave se encontró).
Excepciones
key
o updateValueFactory
es null
.
El diccionario contiene demasiados elementos.
Ejemplos
En el ejemplo de código siguiente se muestra cómo inicializar y ConcurrentDictionary<TKey,TValue> cómo usar el método AddOrUpdate para agregar un elemento adicional a la colección y actualizar los elementos existentes.
using System;
using System.Collections.Concurrent;
class CD_Ctor
{
// Demonstrates:
// ConcurrentDictionary<TKey, TValue> ctor(concurrencyLevel, initialCapacity)
// ConcurrentDictionary<TKey, TValue>[TKey]
static void Main()
{
// We know how many items we want to insert into the ConcurrentDictionary.
// So set the initial capacity to some prime number above that, to ensure that
// the ConcurrentDictionary does not need to be resized while initializing it.
int HIGHNUMBER = 64;
int initialCapacity = 101;
// The higher the concurrencyLevel, the higher the theoretical number of operations
// that could be performed concurrently on the ConcurrentDictionary. However, global
// operations like resizing the dictionary take longer as the concurrencyLevel rises.
// For the purposes of this example, we'll compromise at numCores * 2.
int numProcs = Environment.ProcessorCount;
int concurrencyLevel = numProcs * 2;
// Construct the dictionary with the desired concurrencyLevel and initialCapacity
ConcurrentDictionary<int, int> cd = new ConcurrentDictionary<int, int>(concurrencyLevel, initialCapacity);
// Initialize the dictionary
for (int i = 1; i <= HIGHNUMBER; i++) cd[i] = i * i;
Console.WriteLine("The square of 23 is {0} (should be {1})", cd[23], 23 * 23);
// Now iterate through, adding one to the end of the list. Existing items should be updated to be divided by their
// key and a new item will be added that is the square of its key.
for (int i = 1; i <= HIGHNUMBER + 1; i++)
cd.AddOrUpdate(i, i * i, (k,v) => v / i);
Console.WriteLine("The square root of 529 is {0} (should be {1})", cd[23], 529 / 23);
Console.WriteLine("The square of 65 is {0} (should be {1})", cd[HIGHNUMBER + 1], ((HIGHNUMBER + 1) * (HIGHNUMBER + 1)));
}
}
open System
open System.Collections.Concurrent
// Demonstrates:
// ConcurrentDictionary<TKey, TValue> ctor(concurrencyLevel, initialCapacity)
// ConcurrentDictionary<TKey, TValue>[TKey]
// We know how many items we want to insert into the ConcurrentDictionary.
// So set the initial capacity to some prime number above that, to ensure that
// the ConcurrentDictionary does not need to be resized while initializing it.
let HIGHNUMBER = 64
let initialCapacity = 101
// The higher the concurrencyLevel, the higher the theoretical number of operations
// that could be performed concurrently on the ConcurrentDictionary. However, global
// operations like resizing the dictionary take longer as the concurrencyLevel rises.
// For the purposes of this example, we'll compromise at numCores * 2.
let numProcs = Environment.ProcessorCount
let concurrencyLevel = numProcs * 2
// Construct the dictionary with the desired concurrencyLevel and initialCapacity
let cd = ConcurrentDictionary<int, int>(concurrencyLevel, initialCapacity)
// Initialize the dictionary
for i = 1 to HIGHNUMBER do
cd[i] <- i * i
printfn $"The square of 23 is {cd[23]} (should be {23 * 23})"
// Now iterate through, adding one to the end of the list. Existing items should be updated to be divided by their
// key and a new item will be added that is the square of its key.
for i = 1 to HIGHNUMBER + 1 do
cd.AddOrUpdate(i, i * i, (fun k v -> v / i)) |> ignore
printfn $"The square root of 529 is {cd[23]} (should be {529 / 23})"
printfn $"The square of 65 is {cd[HIGHNUMBER + 1]} (should be {(HIGHNUMBER + 1) * (HIGHNUMBER + 1)})"
Imports System.Collections.Concurrent
Class CD_Ctor
' Demonstrates:
' ConcurrentDictionary<TKey, TValue> ctor(concurrencyLevel, initialCapacity)
' ConcurrentDictionary<TKey, TValue>[TKey]
Public Shared Sub Main()
' We know how many items we want to insert into the ConcurrentDictionary.
' So set the initial capacity to some prime number above that, to ensure that
' the ConcurrentDictionary does not need to be resized while initializing it.
Dim HIGHNUMBER As Integer = 64
Dim initialCapacity As Integer = 101
' The higher the concurrencyLevel, the higher the theoretical number of operations
' that could be performed concurrently on the ConcurrentDictionary. However, global
' operations like resizing the dictionary take longer as the concurrencyLevel rises.
' For the purposes of this example, we'll compromise at numCores * 2.
Dim numProcs As Integer = Environment.ProcessorCount
Dim concurrencyLevel As Integer = numProcs * 2
' Construct the dictionary with the desired concurrencyLevel and initialCapacity
Dim cd As New ConcurrentDictionary(Of Integer, Integer)(concurrencyLevel, initialCapacity)
' Initialize the dictionary
For i As Integer = 1 To HIGHNUMBER
cd(i) = i * i
Next
Console.WriteLine("The square of 23 is {0} (should be {1})", cd(23), 23 * 23)
' Now iterate through, adding one to the end of the list. Existing items should be updated to be divided by their
' key and a new item will be added that is the square of its key.
For i As Integer = 1 To HIGHNUMBER + 1
cd.AddOrUpdate(i, i * i, Function(k, v)
Return v / i
End Function)
Next
Console.WriteLine("The square root of 529 is {0} (should be {1})", cd(23), 529 / 23)
Console.WriteLine("The square of 65 is {0} (should be {1})", cd(HIGHNUMBER + 1), ((HIGHNUMBER + 1) * (HIGHNUMBER + 1)))
End Sub
End Class
Para las modificaciones y las operaciones de escritura en el diccionario, ConcurrentDictionary<TKey,TValue> usa el bloqueo específico para garantizar la seguridad de los subprocesos. (Las operaciones de lectura en el diccionario se realizan de forma sin bloqueos). Los addValueFactory
delegados y updateValueFactory
se pueden ejecutar varias veces para comprobar que el valor se agregó o actualizó según lo previsto. Sin embargo, se llama fuera de los bloqueos para evitar los problemas que pueden surgir al ejecutar código desconocido bajo un bloqueo. Por lo tanto, AddOrUpdate no es atómica con respecto a todas las demás operaciones de la ConcurrentDictionary<TKey,TValue> clase .
Consulte también
Se aplica a
AddOrUpdate<TArg>(TKey, Func<TKey,TArg,TValue>, Func<TKey,TValue,TArg,TValue>, TArg)
- Source:
- ConcurrentDictionary.cs
- Source:
- ConcurrentDictionary.cs
- Source:
- ConcurrentDictionary.cs
Utiliza las funciones especificadas y un argumento para agregar un par clave-valor a ConcurrentDictionary<TKey,TValue> si la clave no existe o para actualizar un par clave-valor de ConcurrentDictionary<TKey,TValue> si la clave ya existe.
public:
generic <typename TArg>
TValue AddOrUpdate(TKey key, Func<TKey, TArg, TValue> ^ addValueFactory, Func<TKey, TValue, TArg, TValue> ^ updateValueFactory, TArg factoryArgument);
public TValue AddOrUpdate<TArg> (TKey key, Func<TKey,TArg,TValue> addValueFactory, Func<TKey,TValue,TArg,TValue> updateValueFactory, TArg factoryArgument);
member this.AddOrUpdate : 'Key * Func<'Key, 'Arg, 'Value> * Func<'Key, 'Value, 'Arg, 'Value> * 'Arg -> 'Value
Public Function AddOrUpdate(Of TArg) (key As TKey, addValueFactory As Func(Of TKey, TArg, TValue), updateValueFactory As Func(Of TKey, TValue, TArg, TValue), factoryArgument As TArg) As TValue
Parámetros de tipo
- TArg
Tipo de un argumento que se va a pasar a addValueFactory
y updateValueFactory
.
Parámetros
- key
- TKey
Clave que se va a agregar o cuyo valor se va a actualizar.
- addValueFactory
- Func<TKey,TArg,TValue>
Función que se usa para generar un valor para una clave ausente.
- updateValueFactory
- Func<TKey,TValue,TArg,TValue>
Función que se usa para generar un nuevo valor para una clave existente basándose en el valor existente de la clave.
- factoryArgument
- TArg
Argumento que se pasará a addValueFactory
y updateValueFactory
.
Devoluciones
Nuevo valor de la clave. Este será el resultado de addValueFactory
(si la clave no se encontró) o el de updateValueFactory
(si la clave se encontró).
Excepciones
key
, addValueFactory
o updateValueFactory
es una referencia nula (Nothing en Visual Basic).
El diccionario contiene demasiados elementos.
Comentarios
Si llama AddOrUpdate simultáneamente a en subprocesos diferentes, addValueFactory
se puede llamar varias veces, pero es posible que su par clave-valor no se agregue al diccionario para cada llamada.
Para las modificaciones y las operaciones de escritura en el diccionario, ConcurrentDictionary<TKey,TValue> usa el bloqueo específico para garantizar la seguridad de los subprocesos. (Las operaciones de lectura en el diccionario se realizan de forma sin bloqueos). Los addValueFactory
delegados y updateValueFactory
se pueden ejecutar varias veces para comprobar que el valor se agregó o actualizó según lo previsto. Sin embargo, se llama fuera de los bloqueos para evitar los problemas que pueden surgir al ejecutar código desconocido bajo un bloqueo. Por lo tanto, AddOrUpdate no es atómica con respecto a todas las demás operaciones de la ConcurrentDictionary<TKey,TValue> clase .