声明:本文为www.cnc6.cn原创,转载时请注明出处,谢谢!html
本文做者文采欠佳,文字表达等方面不是很好,但实际的代码例子是很是实用的,请做参考。ide
1、先准备要使用的类:函数
一、Person类:this
class Person { public string Name { set; get; } public int Age { set; get; } public string Gender { set; get; } public override string ToString() => Name; }
二、准备要使用的List,用于查找(ToLookUp,相似分组):spa
List<Person> personList = new List<Person> { new Person { Name = "P1", Age = 18, Gender = "Male" }, new Person { Name = "P2", Age = 19, Gender = "Male", }, new Person { Name = "P2", Age = 17,Gender = "Female", } };
三、ToLookUp与GroupBy的功能基本同样,但ToLookUp没有GroupBy那样得延迟执行机制,它是当即执行的,且重载只有4个,而GroupBy却有8个之多。code
2、第一种用法:htm
public static ILookup<TKey, TSource> ToLookup<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector);
官方释义:根据指定的键选择器函数,从IEnumerable<TSource>建立一个 ILookup<TKey, TSource>。blog
其实,ToLookUp具备GroupBy同样的分组功能,咱们要LookUp的集合为source,集合内每一个元素的类型为TSource,这里第一个参数keySelector的类型为Func<TSource, TKey>,用于将TSource元素按照由此委托返回的类型TKey进行LookUp,结果为一个已分好组的集合(集合中的集合)。继承
编写客户端试验代码以下:element
var lookups = personList.ToLookup(p => p.Gender); foreach(var lookup in lookups) { Console.Write($"{lookup.Key}:\t"); foreach(var person in lookup) { Console.Write($"{person.Name},{person.Age}\t"); } Console.WriteLine(); }
以上代码指定的KeySelector是Person类的Gender属性,所以,以上会按照Gender(性别)进行LookUp,咱们使用两个嵌套的foreach循环将分组的内容打印到控制台。
由于lookups返回的类型为ILookUp<TKey,TSource>(实际继承于IEnumerable<IGrouping<TKey,TSource>>),所以以上返回的类型为ILookUp<string,Person>。
ILookUp<string,Person>是已经LookUp后的集合,内部集合元素为Person,且ILookUp有一个Key属性,类型为string(指的是Gender属性类型),用于LookUp的标识。
输出结果以下:
3、第2、3、四种用法
因为ToLookUp与GroupBy类似,所以,第2、3、四种用法请参考请参考 [C#] LINQ之GroupBy 。
public static ILookup<TKey, TSource> ToLookup<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer);
官方释义:根据指定的键选择器函数和键比较器,从IEnumerable<TSource>建立一个ILookup<TKey, TElement>。
请参考 [C#] LINQ之GroupBy 中的第二种用法。
public static ILookup<TKey, TElement> ToLookup<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector);
官方释义:根据指定的键选择器和元素选择器函数,从IEnumerable<TSource>建立一个ILookup<TKey, TElement>。
请参考 [C#] LINQ之GroupBy 中的第三种用法。
public static ILookup<TKey, TElement> ToLookup<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, IEqualityComparer<TKey> comparer);
官方释义:根据指定的键选择器函数、比较器和元素选择器函数,从IEnumerable<TSource>建立一个ILookup<TKey, TElement>。
请参考 [C#] LINQ之GroupBy 中的第五种用法。