C# Lookup类 Lookup<TKey, TSource>与 Dictionary<TKey, TSource>区别

Dictionary<TKey, TValue>只为每个键支持一个值。新类Lookup<TKey, TElement>是.NET 3.5中新增的,它类似于Dictionary<TKey, TValue>,但把键映射到一个值集上。这个类在程序集System.Core中实现,用System.Linq命名空间定义

Lookup<TKey, TElement>不能像一般的字典那样创建,而必须调用方法ToLookup(),它返回一个Lookup<TKey, TElement>对象。方法ToLookup()是一个扩展方法,可以用于实现了IEnumerable<T>的所有类。在下面的例子中,填充了一列Racer对象。List<T>实现了IEnumerable<T>,所以可以在赛手列表上调用方法ToLookup()。这个方法需要一个Func<TSource, TKey>类型的委托,Func<TSource, TKey>类型定义了键的选择器。这里使用 表达式r=>r.Country,根据国家来选择赛手。Foreach循环只使用索引器访问来自奥地利的赛手。

以下是Lookup<TKey, TElement>应用实例

    class Racer
    {
        public string FirstName { get; }
        public string LastName { get; }
        public string Country { get; }
        public Racer(string firstName,string lastName,string country)
        {
            FirstName = firstName;
            LastName = lastName;
            Country = country;
        }
    }

public void TestMethod()
{
    List<Racer> racers = new List<Racer>();
    racers.Add(new Racer("Jacques", "Villeneuve", "Canada"));
    racers.Add(new Racer("Alan", "Jones", "Australia"));
    racers.Add(new Racer("Jack", "Brabham", "Australia"));
    racers.Add(new Racer("Jack", "Brabham", "Australia"));
    //public static ILookup<TKey, TSource> ToLookup<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector); 
    //这是.NET封装ToLookup的方法
    ILookup<string, Racer> lookupRacers = racers.ToLookup(r => r.Country);
    foreach (Racer r in lookupRacers["Australia"])
    {
        //原创来自http://www.luofenming.com/show.aspx?id=ART2019051900001
        //这样可以获得  Racer("Alan", "Jones", "Australia")和2个Racer("Jack", "Brabham", "Australia")
        Racer rl = r;
        //Dictionary<TKey, TSource>的TKey不能重重复
        //Lookup<TKey, TSource> 的TKey可以重复
    }
}