programar - obtener key de un diccionario c#
Agregar un diccionario a otro (5)
Cree un método de extensión. Lo más probable es que desee usar esto más de una vez y esto evita el código duplicado.
Implementación:
public static void AddRange<T, S>(this Dictionary<T, S> source, Dictionary<T, S> collection)
{
if (collection == null)
{
throw new ArgumentNullException("Collection is null");
}
foreach (var item in collection)
{
if(!source.ContainsKey(item.Key)){
source.Add(item.Key, item.Value);
}
else
{
// handle duplicate key issue here
}
}
}
Uso:
Dictionary<string,string> animals = new Dictionary<string,string>();
Dictionary<string,string> newanimals = new Dictionary<string,string>();
animals.AddRange(newanimals);
Posibles duplicados:
Fusionando diccionarios en C #
¿Cuál es la forma más rápida de copiar los valores y las claves de un diccionario a otro en C #?
Tengo un diccionario que tiene algunos valores, digamos:
Animals <string, string>
Ahora recibo otro diccionario similar, por ejemplo:
NewAnimals <string,string>
¿Cómo puedo agregar todo el diccionario NewAnimals a Animals?
La forma más obvia es:
foreach(var kvp in NewAnimals)
Animals.Add(kvp.Key, kvp.Value);
//use Animals[kvp.Key] = kvp.Value instead if duplicate keys are an issue
Dado que Dictionary<TKey, TValue>
implementa explícitamente ICollection<KeyValuePair<TKey, TValue>>.Add
method, también puede hacer esto:
var animalsAsCollection = (ICollection<KeyValuePair<string, string>>) Animals;
foreach(var kvp in NewAnimals)
animalsAsCollection.Add(kvp);
Es una pena que la clase no tenga un método AddRange
como List<T>
.
La respuesta corta es, tienes que repetir.
Más información sobre este tema:
¿Cuál es la forma más rápida de copiar los valores y las claves de un diccionario a otro en C #?
Puede recorrer todos los animales utilizando foreach y ponerlo en NewAnimals.
foreach(var newAnimal in NewAnimals)
Animals.Add(newAnimal.Key,newAnimal.Value)
Nota: esto arroja una excepción en una clave duplicada.
O si realmente desea ir a la ruta del método de extensión (no lo haría), entonces podría definir un método general de extensión AddRange
que funcione en cualquier ICollection<T>
, y no solo en Dictionary<TKey,TValue>
.
public static void AddRange<T>(this ICollection<T> target, IEnumerable<T> source)
{
if(target==null)
throw new ArgumentNullException(nameof(target));
if(source==null)
throw new ArgumentNullException(nameof(source));
foreach(var element in source)
target.Add(element);
}
(arroja llaves duplicadas para los diccionarios)