it-swarm-eu.dev

Was ist der schnellste Weg, um die Werte und Schlüssel von einem Wörterbuch in ein anderes in C # zu kopieren?

Es scheint kein Wörterbuch zu geben. AddRange () - Methode. Kennt jemand eine bessere Möglichkeit, die Elemente in ein anderes Wörterbuch zu kopieren, ohne eine foreach-Schleife zu verwenden?.

Ich verwende das System.Collections.Generic.Dictionary. Dies ist für .NET 2.0.

25
Helephant

An einer for/foreach-Schleife ist nichts auszusetzen. Das ist alles, was eine hypothetische AddRange-Methode sowieso tun würde.

Das einzige zusätzliche Problem, das ich hätte, ist das Verhalten bei der Speicherzuweisung, da das Hinzufügen einer großen Anzahl von Einträgen zu mehreren Neuzuweisungen und erneuten Hashes führen kann. Es gibt keine Möglichkeit, die Kapazität eines vorhandenen Wörterbuchs um einen bestimmten Betrag zu erhöhen. Es ist möglicherweise besser, ein neues Wörterbuch mit ausreichender Kapazität für beide aktuellen zuzuweisen, aber Sie benötigen immer noch eine Schleife, um mindestens eines davon zu laden.

16
Mike Dimmick

Es gibt den Konstruktor Dictionary, der eine andere Dictionary akzeptiert.

Sie müssen es als IDictionary umwandeln, aber es gibt eine Add()-Überladung, die KeyValuePair<TKey, TValue> benötigt. Sie verwenden jedoch immer noch foreach.

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

man kann ein existierendes Tierwörterbuch an den Konstruktor übergeben.

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

Zum Spaß habe ich diese Erweiterungsmethode zum Wörterbuch erstellt. Dies sollte nach Möglichkeit 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
BFree

Wenn Sie mit zwei vorhandenen Objekten arbeiten, können Sie mit der CopyTo-Methode einige Meilen sammeln: http://msdn.Microsoft.com/en-us/library/cc645053.aspx

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

0
Oli

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

Möchten Sie eine flache Kopie oder eine tiefe Kopie ausführen? (Das heißt, beide Wörterbücher verweisen auf dieselben Referenzen oder auf neue Kopien jedes Objekts im neuen Wörterbuch?)

Wenn Sie ein neues Wörterbuch erstellen möchten, das auf neue Objekte verweist, denke ich, dass der einzige Weg durch ein foreach ist.

0