2008-09-17 3 views

Antwort

15

Es ist nichts falsch mit einer for/foreach-Schleife. Das alles wäre eine hypothetische AddRange-Methode.

Die einzige zusätzliche Sorge, die ich haben würde, ist mit Speicherzuordnungsverhalten, da das Hinzufügen einer großen Anzahl von Einträgen mehrere Neuzuweisungen und erneute Hashes verursachen kann. Es gibt keine Möglichkeit, die Kapazität eines vorhandenen Wörterbuchs um einen bestimmten Betrag zu erhöhen. Sie sollten besser ein neues Dictionary mit ausreichender Kapazität für beide aktuellen zuweisen, aber Sie benötigen immer noch eine Schleife, um mindestens eine von ihnen zu laden.

18

Es gibt den Dictionary Konstruktor, der ein weiteres Dictionary nimmt.

Sie müssen es IDictionary werfen, aber es gibt eine Add() Überladung, die KeyValuePair<TKey, TValue> dauert. Du benutzt trotzdem foreach.

+2

Danke für die Antwort, aber beide Wörterbücher haben Elemente in ihnen an der Stelle ich die Kopie tun müssen. – Helephant

0

Wenn Sie mit zwei bestehenden Objekten zu tun haben, müssen Sie möglicherweise einige Kilometer mit der CopyTo-Methode erhalten: http://msdn.microsoft.com/en-us/library/cc645053.aspx

Verwenden Sie die Add-Methode der anderen Sammlung (Empfänger), um sie zu absorbieren.

+0

Ich konnte keine Add-Methode für Dictionary finden, die ein Array aufnehmen würde? – Helephant

0

Ich verstehe nicht, warum nicht das Wörterbuch (Dictionary) verwenden (wie von ageektrapped vorgeschlagen).

Möchten Sie eine Shallow Copy oder eine Deep Copy ausführen? (Das heißt, beide Wörterbücher Hinweis auf die gleichen Referenzen oder neue Kopien von jedem Objekt in dem neuen Wörterbuch?)

Wenn Sie ein neue Wörterbuch zeigt auf neue Objekte erstellen wollen, denke ich, dass der einzige Weg, ist durch eine foreach.

+0

Flache Kopie ist in Ordnung. Ich habe zwei Wörterbücher, die ich in einer Methode bevölkere, und ich möchte das zweite kleinere Wörterbuch am Ende der Methode in die erste kopieren. Ich muss sie während des Lebens der Methode getrennt halten, weil sie verschiedene Dinge meinen. – Helephant

3

Zum Spaß habe ich diese Erweiterung Methode zum Wörterbuch erstellt. Dies sollte möglichst eine tiefe Kopie machen.

public static Dictionary<TKey, TValue> DeepCopy<TKey,TValue>(this Dictionary&lt;TKey, TValue> dictionary) 
     { 
      Dictionary<TKey, TValue> d2 = new Dictionary<TKey, TValue>(); 

      bool keyIsCloneable = default(TKey) is ICloneable; 
      bool valueIsCloneable = default(TValue) is ICloneable; 

      foreach (KeyValuePair<TKey, TValue> kvp in dictionary) 
      { 
       TKey key = default(TKey); 
       TValue value = default(TValue); 
       if (keyIsCloneable) 
       { 
        key = (TKey)((ICloneable)(kvp.Key)).Clone(); 
       } 

       else 
       { 
        key = kvp.Key; 
       } 

       if (valueIsCloneable) 
       { 
        value = (TValue)((ICloneable)(kvp.Value)).Clone(); 
       } 

       else 
       { 
        value = kvp.Value; 
       } 

       d2.Add(key, value); 
      } 

      return d2; 
     } 
3

var Animal = new Dictionary < string, string >() ;

kann man vorhandene Tier Wörterbuch an den Konstruktor übergeben.

Dictionary< string, string > NewAnimals = new Dictionary< string, string >(Animal);

Verwandte Themen