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可以重复
}
}