2009-04-03 31 views
44

C# içinde <string,object> türünde iki sözlük var. Bir Dictionary nesnesinin tüm içeriğini bir döngüyü uygulamadan diğerine nasıl kopyalarım?İki sözlük, döngü olmadan nasıl birleştirilir?

+0

Sorunuzdaki tür adı AWOL gitti. – dommer

+0

Eğer birleştirme arıyorsanız, şu adrese başvurmalısınız: http://stackoverflow.com/questions/294138/merging-dictionaries-in-c – annakata

cevap

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

Sen Concat kullanabilirsiniz:

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

Bu, IEnumerable > 'i döndürecektir. Bir sözlük almak için ToDictionary'ı aramalıyız. –

+0

Bu doğru. Bunu işaret ettiğin için teşekkürler. Düzenleyecek –

9

İlk olarak, bu mümkün değil olmadan döngü. Bu döngü bir (uzantı) yönteminde gerçekleştirilip gerçekleştirilmediği, hala bir döngü gerektiriyor.

Aslında bunu manuel olarak yapmanızı tavsiye edeceğim. Verilen tüm diğer cevaplar iki uzatma metodu (Concat - ToDictionary ve SelectMany - ToDictionary) kullanmak ve böylece iki kez döngü yapmak zorundadır. kodunuzu optimize etmek için bu yapıyorsanız, sözlükte B üzerinde bir döngü yapmak daha hızlı ve

Düzenleme sözlük A'ya içeriğini var katacak: ToDictionary sırasında ayrıntılı araştırma yapılmış Concat işlem yalnızca oluşacak çağrı, ama hala özel bir uzantı yöntemi daha verimli olacağını düşünüyorum.

Eğer kod boyutunu azaltmak isterseniz, o zaman sadece bir uzantısı yöntemi yapmak:

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

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; 
    } 
} 

Sonra DictionaryExtensions ad ve yazma ('kullanarak') ithal ederek kullanabilirsiniz

Yöntemi, nesneler değişmez gibi harekete geçirdim, ancak yeni bir sözlük döndürmemek ve sadece dictA'ya birleştirmek için kolayca değiştirebilirsiniz.

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

Bu, Bruno'nun cevabıyla tamamen aynıdır. –

+0

Simpleed ama aynı cevap evet, downvote için bir neden değil – RvdK

+0

Üzgünüz ama ben bruno ToDictionary aramayı dahil etmek için onun cevabını güncelledi önce - daha önce kod bir IEnumerable dönüyordu

İlgili konular