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>应用实例
1 2 3 4 5 6 7 8 9 10 11 12 | 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; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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" ]) { //这样可以获得 Racer("Alan", "Jones", "Australia")和2个Racer("Jack", "Brabham", "Australia") Racer rl = r; //Dictionary<TKey, TSource>的TKey不能重重复 //Lookup<TKey, TSource> 的TKey可以重复 } } |