أفضل تنفيذ لبنية بيانات زوج القيمة الرئيسية؟

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

  •  08-06-2019
  •  | 
  •  

سؤال

لقد كنت أتجول في C# مؤخرًا، وجميع المجموعات العامة جعلتني في حيرة من أمري.لنفترض أنني أردت تمثيل بنية بيانات حيث يكون رأس الشجرة زوجًا من القيمة الرئيسية، ثم توجد قائمة اختيارية واحدة لأزواج القيمة الرئيسية أسفل ذلك (ولكن ليس هناك مستويات أكثر من هذه).هل سيكون هذا مناسبا؟

public class TokenTree
{
    public TokenTree()
    {
        /* I must admit to not fully understanding this,
         * I got it from msdn. As far as I can tell, IDictionary is an
         * interface, and Dictionary is the default implementation of
         * that interface, right?
         */
        SubPairs = new Dictionary<string, string>();
    }

    public string Key;
    public string Value;
    public IDictionary<string, string> SubPairs;
}

إنها في الحقيقة مجرد تحويلة بسيطة لتمرير البيانات.

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

المحلول

يوجد نوع بيانات فعلي يسمى KeyValuePair، استخدمه على هذا النحو

KeyValuePair<string, string> myKeyValuePair = new KeyValuePair<string,string>("defaultkey", "defaultvalue");

نصائح أخرى

أحد الأشياء الممكنة التي يمكنك القيام بها هو استخدام كائن القاموس مباشرة بعد إخراجه من الصندوق ثم توسيعه بتعديلاتك الخاصة:

public class TokenTree : Dictionary<string, string>
{
    public IDictionary<string, string> SubPairs;
}

يمنحك هذا ميزة عدم الاضطرار إلى فرض قواعد IDictionary لمفتاحك (على سبيل المثال، تفرد المفتاح، وما إلى ذلك).

ونعم لقد فهمت مفهوم المنشئ بشكل صحيح :)

أعتقد أن ما قد تبحث عنه (كتنفيذ حرفي لسؤالك) هو:

public class TokenTree
{
    public TokenTree()
    {
        tree = new Dictionary<string, IDictionary<string,string>>();
    }

    IDictionary<string, IDictionary<string, string>> tree; 
}

لقد قلت بالفعل "قائمة" من القيم الأساسية في سؤالك، لذا قد ترغب في تبديل القيم الداخلية IDictionary مع:

IList<KeyValuePair<string, string>>

يوجد نوع مدمج KeyValuePair.في واقع الأمر، هذا هو ما يتيح لك IDictionary الوصول إليه عندما تتكرر فيه.

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

هناك شيء واحد فقط يجب إضافته إلى هذا (على الرغم من أنني أعتقد أن الآخرين قد أجابوا على سؤالك بالفعل).من أجل التوسع (نظرًا لأننا نعلم جميعًا أن ذلك سيحدث في مرحلة ما) قد ترغب في التحقق من ملف نمط مركب هذا مثالي للعمل مع "الهياكل الشبيهة بالشجرة".

كما قلت، أعلم أنك تتوقع مستوى فرعيًا واحدًا فقط، ولكن قد يكون هذا مفيدًا لك حقًا إذا كنت بحاجة إلى التوسع لاحقًا ^_^

@جاي موني:إن فئة القاموس العامة في .NET هي في الواقع جدول تجزئة، مع أنواع ثابتة فقط.

لا ينبغي للكود الذي أظهرته أن يقنع أي شخص باستخدام Hashtable بدلاً من Dictionary، حيث يمكن استخدام كلا قطعتي الكود لكلا النوعين.

بالنسبة للهاشتابل:

foreach(object key in h.keys)
{
     string keyAsString = key.ToString(); // btw, this is unnecessary
     string valAsString = h[key].ToString();

     System.Diagnostics.Debug.WriteLine(keyAsString + " " + valAsString);
}

للقاموس:

foreach(string key in d.keys)
{
     string valAsString = d[key].ToString();

     System.Diagnostics.Debug.WriteLine(key + " " + valAsString);
}

والشيء نفسه بالنسبة للآخر مع KeyValuePair، ما عليك سوى استخدام الإصدار غير العام لـ Hashtable، والإصدار العام للقاموس.

لذا فالأمر سهل في كلا الاتجاهين، لكن Hashtable يستخدم Object لكل من المفتاح والقيمة، مما يعني أنك ستضع جميع أنواع القيم في المربع، وليس لديك أمان للكتابة، ويستخدم القاموس أنواعًا عامة وبالتالي فهو أفضل.

فئة القاموس هو بالضبط ما تريد، صحيح.

يمكنك تعريف الحقل مباشرة كقاموس، بدلاً من معرف القاموس، ولكن هذا الأمر متروك لك.

استخدم شيئًا مثل هذا:

class Tree < T > : Dictionary < T, IList< Tree < T > > >  
{  
}  

إنه قبيح، لكني أعتقد أنه سيعطيك ما تريد.تم إغلاق KeyValuePair السيئ جدًا.

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