أفضل طريقة لاستخدام قائمة<T> في مفتاح/قيمة المجموعة ؟

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

سؤال

ما هي أفضل طريقة للحفاظ على مجموعة وجوه (قائمة في المثال) في مفتاح/قيمة هذا الوضع ، حيث المفتاح هو معرف قيمة هي عبارة عن مجموعة من نوع T ؟

هل هذا هو الخيار الوحيد أم أن هناك حل أفضل/مجموعة أخرى في .NET framework 3.5?

var x = new Dictionary<int, List<type>>();
هل كانت مفيدة؟

المحلول

وهذا هو حل جيد وسوف تعمل بشكل جيد جدا - كنت على نحو فعال باستخدام كائن القاموس من {الرئيسية = عدد صحيح، القيمة = 4 بايت إشارة}

عند استرداد قيمة بواسطة مفتاح سوف نعود الإشارة إلى List<T> على كومة، وتكون قادرة على استخدامها. وسيكون هذا الحل يتسم بفعالية جدا وصغير الحجم لمشكلة واضحة الخاص بك.

نصائح أخرى

وليس لدي أي فكرة ما إذا كان هذا هو ما تحتاجه ولكن سآخذ ختم في ذلك.

public Dictionary<int,List<T>> myFunction<T>()
{
    var returnvalue = new Dictionary<int,List<T>>();
    //Do some stuff with the collection.
    return returnvalue;
}

والتي يمكنك الاتصال ثم

public void Main()
{
  var functionreturn = myFunction<String>();
}

وأنا لست متأكدا مما إذا كان هذا سيساعدك أم لا ولكن قد تساعدك على إعادة صياغة سؤالك.

ملحوظة: ما سبق هو كود الهواء ولم تختبر

وأنا لا أعتقد أن هناك أي شيء في إطار، ولكن أعتقد أن هناك مجموعة MultiDictionary في المكتبة PowerCollections. هل يمكن أن تحاول ذلك.

أعتقد أنه ربما يجب عليك كتابة المجمع الدرجة وفقا للاحتياجات الخاصة بك.أعني, إذا كنت بحاجة لتخزين قاموس مسبقة الصنع القوائم ، Dictionary<int, List<type>> ينبغي أن يكون على ما يرام طالما انها ملكية خاصة.يجب أن لا تعرض عليه على الرغم علنا كما من الواضح أنه يعرض الكثير من المعلومات و لا يمكن أن يلقي ذلك إلى IDictionary<int, IList<T>> أو شيئا من هذا القبيل بسبب عدم وجود التغاير.

أفضل رهان سيكون شيئا مثل هذا:

class MyWrapper<T>()
{
    private Dictionary<int, List<T>> dictionary { get; set; }
    public MyWrapper() { dictionary = new Dictionary<int, List<T>>(); }

    // Adds a new item to the collection
    public void Add(int key, T item)
    {
       List<T> list = null;
       if (!dictionary.TryGetValue(key, out list))
       {
          // If dictionary does not contain the key, we need to create a new list
          list = new List<T>();
          dictionary.Add(key, list);
       }
       list.Add(item);
    }

    public IEnumerable<T> this[int key]     
    {
       get
       {
           List<T> list = null;
           // We just return an empty list if the key is not found
           if (!dictionary.TryGetValue(key, out list)) return new List<T>();
           else return list;
       }
    }
}

ومن الواضح الاحتياجات الخاصة بك قد تكون مختلفة ، قد تحتاج إلى تنفيذ اثنين من واجهات ، وما إلى ذلك ، ولكن هذه هي الفكرة العامة.

إذا ID الخاص بك عضوا من نوع الخاص بك، فإنك قد تنظر في تنفيذ System.Collections.ObjectModel.KeyedCollection<TKey, TItem>

هل تبحث عن القاموس تقدر متعددة، أي مجموعة مقفول، حيث يمكن أن يكون كل مفتاح قيم متعددة؟ PowerCollections لديه مثل هذه MultiDictionary.

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