سؤال

MSDN يفسر بحث مثل هذا:

A Lookup<TKey, TElement> يشبه Dictionary<TKey, TValue>.الفرق هو أن القاموس<TKey, TValue=""> خرائط مفاتيح واحدة القيم ، بينما البحث<TKey, TElement=""> خرائط مفاتيح مجموعات من القيم.

أنا لا أجد هذا التفسير مفيدة بشكل خاص.ما هو البحث المستخدمة ؟

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

المحلول

انها خليط بين IGrouping و القاموس.فإنه يتيح لك تجميع العناصر معا بواسطة مفتاح, ولكن ثم الوصول إليها عبر هذا المفتاح بطريقة فعالة (بدلا من مجرد بالتكرار على كل منهم ، وهو ما GroupBy يتيح لك أن تفعل).

على سبيل المثال, يمكنك أن تأخذ حمولة .صافي أنواع وبناء البحث عن طريق الاسم...ثم الحصول على جميع الأنواع في مساحة بسهولة جدا:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml;

public class Test
{
    static void Main()
    {
        // Just types covering some different assemblies
        Type[] sampleTypes = new[] { typeof(List<>), typeof(string), 
                                     typeof(Enumerable), typeof(XmlReader) };

        // All the types in those assemblies
        IEnumerable<Type> allTypes = sampleTypes.Select(t => t.Assembly)
                                               .SelectMany(a => a.GetTypes());

        // Grouped by namespace, but indexable
        ILookup<string, Type> lookup = allTypes.ToLookup(t => t.Namespace);

        foreach (Type type in lookup["System"])
        {
            Console.WriteLine("{0}: {1}", 
                              type.FullName, type.Assembly.GetName().Name);
        }
    }
}

(كنت عادة استخدام var معظم هذه الإعلانات في القانون العادي.)

نصائح أخرى

طريقة واحدة للتفكير في الامر هو هذا: Lookup<TKey, TElement> مشابه Dictionary<TKey, Collection<TElement>>.أساسا قائمة صفر أو أكثر من العناصر يمكن إرجاعها عن طريق نفس المفتاح.

namespace LookupSample
{
    using System;
    using System.Collections.Generic;
    using System.Linq;

    class Program
    {
        static void Main(string[] args)
        {
            List<string> names = new List<string>();
            names.Add("Smith");
            names.Add("Stevenson");
            names.Add("Jones");

            ILookup<char, string> namesByInitial = names.ToLookup((n) => n[0]);

            // count the names
            Console.WriteLine("J's: {0}", namesByInitial['J'].Count()); // 1
            Console.WriteLine("S's: {0}", namesByInitial['S'].Count()); // 2
            Console.WriteLine("Z's: {0}", namesByInitial['Z'].Count()); // 0, does not throw
        }
    }
}

استخدام واحد من Lookup يمكن أن يكون عكس Dictionary.

افترض أن لديك دليل الهاتف تنفيذها Dictionary مع مجموعة من (فريدة من نوعها) الأسماء مفاتيح كل اسم يرتبط مع رقم الهاتف.ولكن اثنين من الناس مع أسماء مختلفة تتقاسم نفس رقم الهاتف.هذه ليست مشكلة بالنسبة Dictionary, الذي لا يبالي أن اثنين من مفاتيح تتوافق مع نفس القيمة.

الآن تريد الطريقة من إعطاء رقم الهاتف ينتمي إلى.بناء Lookup, ، مضيفا أن كل KeyValuePairs من Dictionary, لكن عكسيا مع قيمة المفتاح و المفتاح قيمة.يمكنك الآن الاستعلام عن رقم الهاتف والحصول على قائمة بأسماء جميع الأشخاص الذين الهاتف رقم.بناء Dictionary مع نفس البيانات إسقاط البيانات (أو تفشل ، اعتمادا على كيف فعلت ذلك) ،

dictionary["555-6593"] = "Dr. Emmett Brown";
dictionary["555-6593"] = "Marty McFly";

يعني أن دخول الثانية الكتابة الأولى - الطبيب لم يعد المدرجة.

أحاول كتابة نفس البيانات بطريقة مختلفة قليلا:

dictionary.Add("555-6593", "Dr. Emmett Brown");
dictionary.Add("555-6593", "Marty McFly");

رمي استثناء على السطر الثاني إذ لا يمكن أن Add مفتاح الذي هو بالفعل في Dictionary.

[بالطبع, قد ترغب في استخدام بعض واحد آخر البيانات بنية القيام به عمليات البحث في كلا الاتجاهين ، إلخ.هذا المثال يعني أن لديك لتجديد Lookup من Dictionary في كل مرة هذا الأخير التغييرات.ولكن بعض البيانات يمكن أن يكون الحل الصحيح.]

أنا لم تستخدم بنجاح من قبل, ولكن هنا هو بلدي الذهاب:

A Lookup<TKey, TElement> أن تتصرف حد كبير مثل (relational) بيانات مؤشر على الطاولة دون قيد فريد.استخدامه في نفس الأماكن التي يمكنك استخدام أخرى.

أعتقد أنك يمكن أن يجادل في الأمر بهذه الطريقة:تخيل أنك خلق بنية بيانات عقد محتويات دفتر الهاتف.كنت تريد أن المفتاح عن طريق اسم العائلة ثم الاسم الأول.استخدام القاموس هنا سيكون خطيرا لأن الكثير من الناس يمكن أن يكون لها نفس الاسم.حتى قاموس دائما على الأكثر الخريطة قيمة واحدة.

بحث خريطة يحتمل عدة قيم.

البحث["سميث"]["جون"] سوف تكون مجموعة من حجم واحد مليار دولار.

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