2009-04-03 59 views
44

Tengo dos diccionarios de tipo <string,object> en C#. ¿Cómo puedo copiar todo el contenido de un objeto de diccionario al otro sin aplicar un bucle?¿Cómo combinar dos diccionarios sin bucle?

+0

Parece que el nombre de tipo en su pregunta ha desaparecido sin previo aviso. – dommer

+0

si está buscando una fusión, debe consultar: http://stackoverflow.com/questions/294138/merging-dictionaries-in-c – annakata

Respuesta

5
var result = dictionaries.SelectMany(dict => dict) 
      .ToDictionary(pair => pair.Key, pair => pair.Value); 
38

Puede utilizar Concat:

Dictionary<string, object> d1 = new Dictionary<string, object>(); 
d1.Add("a", new object()); 
d1.Add("b", new object()); 
Dictionary<string, object> d2 = new Dictionary<string, object>(); 
d2.Add("c", new object()); 
d2.Add("d", new object()); 

Dictionary<string, object> d3 = d1.Concat(d2).ToDictionary(e => e.Key, e => e.Value); 

foreach (var item in d3) 
{ 
    Console.WriteLine(item.Key); 
} 
+1

Esto devolverá un IEnumerable >, lo hará necesita llamar a ToDictionary para obtener un diccionario. –

+0

Eso es verdad. Gracias por señalar eso. Editaré –

9

En primer lugar, no es posible sin bucle. Si ese bucle se realiza en un método (extensión) es irrelevante, aún requiere un bucle.

De hecho, voy a recomendar hacerlo manualmente. Todas las otras respuestas dadas requieren el uso de dos métodos de extensión (Concat - ToDictionary y SelectMany - ToDictionary) y, por lo tanto, se repiten dos veces. Si usted está haciendo esto para optimizar su código, que será más rápido para hacer un bucle sobre el diccionario de B y añadir su contenido a diccionario A.

Editar: Después de investigaciones adicionales, habría sólo se produce la operación de concatenación durante el ToDictionary llamar, pero sigo pensando que un método de extensión personalizado sería más eficiente.

Si desea reducir el tamaño de su código, a continuación, sólo hacer un método de extensión:

public static class DictionaryExtensions 
{ 
    public static IDictionary<TKey,TVal> Merge<TKey,TVal>(this IDictionary<TKey,TVal> dictA, IDictionary<TKey,TVal> dictB) 
    { 
     IDictionary<TKey,TVal> output = new Dictionary<TKey,TVal>(dictA); 

     foreach (KeyValuePair<TKey,TVal> pair in dictB) 
     { 
      // TODO: Check for collisions? 
      output.Add(pair.Key, Pair.Value); 
     } 

     return output; 
    } 
} 

A continuación, se puede utilizar mediante la importación ('utilizar') el espacio de nombres DictionaryExtensions y la escritura:

IDictionary<string,objet> output = dictA.Merge(dictB); 

He hecho que el método actúe como si los objetos fueran inmutables, pero podría modificarlo fácilmente para que no devuelva un nuevo diccionario y simplemente se fusione con dictA.

87
var d3 = d1.Concat(d2).ToDictionary(x => x.Key, x => x.Value); 
+0

Esto es exactamente lo mismo que la respuesta de Bruno. –

+0

Simplefied pero la misma respuesta sí, no es una razón para rechazar – RvdK

+0

Lo siento pero publiqué antes de que bruno actualizara su respuesta para incluir la llamada a ToDictionary - anteriormente el código devolvía un IEnumerable