*.Net框架 - IGrouping类 & Lookup类
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循环只使用索引器访问来自奥地利的赛手,代码如下:
List < Racer > 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)); Lookup < string, Racer > lookupRacers = (Lookup < string, Racer > ) racers.ToLookup(r = > r.Country); foreach (Racer r in lookupRacers["Australia"]) { Console.WriteLine(r); }
结果显示出来自奥地利的赛手:
Alan Jones
Jack Brabham
分组数据类型IGrouping接口:
namespace System.Linq { public interface IGrouping<out TKey, out TElement> : IEnumerable<TElement>, IEnumerable { TKey Key { get; } } public interface ILookup<TKey, TElement> : IEnumerable<IGrouping<TKey, TElement>>, IEnumerable { IEnumerable<TElement> this[TKey key] { get; } int Count { get; } bool Contains(TKey key); } }
参考
[1] book.51cto.com,Lookup类