ما هي أسرع طريقة لنسخ القيم والمفاتيح من قاموس إلى آخر في C#؟

StackOverflow https://stackoverflow.com/questions/81552

  •  09-06-2019
  •  | 
  •  

سؤال

لا يبدو أن هناك طريقة Dictionary.AddRange().هل يعرف أحد طريقة أفضل لنسخ العناصر إلى قاموس آخر دون استخدام حلقة foreach.

أنا أستخدم System.Collections.Generic.Dictionary.هذا مخصص لـ .NET 2.0.

هل كانت مفيدة؟

المحلول

لا حرج في حلقة for/foreach.هذا كل ما ستفعله طريقة AddRange الافتراضية على أي حال.

القلق الإضافي الوحيد الذي قد يكون لدي هو سلوك تخصيص الذاكرة، لأن إضافة عدد كبير من الإدخالات قد يؤدي إلى عمليات إعادة تخصيص متعددة وإعادة تجزئتها.لا توجد طريقة لزيادة سعة القاموس الموجود بمقدار معين.قد يكون من الأفضل لك تخصيص قاموس جديد بسعة كافية لكلا القاموسين الحاليين، ولكنك ستظل بحاجة إلى حلقة لتحميل واحد منهما على الأقل.

نصائح أخرى

هناك Dictionary منشئ يأخذ آخر Dictionary.

سيكون عليك أن ترميها IDictionary, ، ولكن هناك Add() الزائد الذي يأخذ KeyValuePair<TKey, TValue>.ومع ذلك، لا تزال تستخدم foreach.

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

يمكن للمرء تمرير قاموس الحيوان الموجود إلى المنشئ.

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

من أجل المتعة، قمت بإنشاء طريقة التمديد هذه للقاموس.يجب أن يقوم هذا بنسخة عميقة حيثما كان ذلك ممكنًا.

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

إذا كنت تتعامل مع كائنين موجودين، فقد تحصل على بعض النجاح باستخدام التابع CopyTo: http://msdn.microsoft.com/en-us/library/cc645053.aspx

استخدم طريقة الإضافة للمجموعة الأخرى (المتلقي) لاستيعابهم.

لا أفهم لماذا لا تستخدم القاموس (القاموس) (كما اقترح ageektrapped ).

هل تريد إجراء نسخة ضحلة أو نسخة عميقة؟(أي يشير كلا القواميس إلى نفس المراجع أو إلى نسخ جديدة من كل كائن داخل القاموس الجديد؟)

إذا كنت ترغب في إنشاء جديد يشير القاموس إلى جديد الكائنات، وأعتقد أن الطريقة الوحيدة هي من خلال com.foreach.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top