Dictionary<TKey,TValue>类支持每个键关联一个值。Lookup<TKey,TElement>类非常类似于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>类型定义了键的选择器。这里使用lambda表达式r=>r.Country,根据国家来选择赛车手。foreach循环只使用索引器访问来自澳大利亚的赛车手。
using System;
using System.Collections.Generic;
using System.Linq;
namespace Lookup
{
class Program
{
static void Main(string[] args)
{
var racers = new List<Racer>();
racers.Add(new Racer("Jacques","Villeneuve","Canada",11));
racers.Add(new Racer("Alan","Jones","Australia",12));
racers.Add(new Racer("Jackie","Stewart","United Kingdom",27));
racers.Add(new Racer("James","Hunt","United Kingdom",10));
racers.Add(new Racer("Jack","Brabham","Australia",14));
var lookupRacers = racers.ToLookup(r=>r.Country);
foreach(var value in lookupRacers["Australia"]){
System.Console.WriteLine(value);
}
}
}
public class Racer{
public string FirstName{get;}
public string LastName{get;}
public string Country{get;}
public int Wins{get;}
public Racer(string firstName,string lastName,string country,int wins){
FirstName = firstName;
LastName = lastName;
Country = country;
Wins = wins;
}
public override string ToString()=>$"{FirstName} {LastName} {Country} {Wins}";
}
}
输出如下:
Alan Jones Australia 12
Jack Brabham Australia 14