ما هو الهدف من البحث<TKey, TElement="">?
سؤال
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) بيانات مؤشر على الطاولة دون قيد فريد.استخدامه في نفس الأماكن التي يمكنك استخدام أخرى.
أعتقد أنك يمكن أن يجادل في الأمر بهذه الطريقة:تخيل أنك خلق بنية بيانات عقد محتويات دفتر الهاتف.كنت تريد أن المفتاح عن طريق اسم العائلة ثم الاسم الأول.استخدام القاموس هنا سيكون خطيرا لأن الكثير من الناس يمكن أن يكون لها نفس الاسم.حتى قاموس دائما على الأكثر الخريطة قيمة واحدة.
بحث خريطة يحتمل عدة قيم.
البحث["سميث"]["جون"] سوف تكون مجموعة من حجم واحد مليار دولار.