C#中的Linq是一个强大的数据查询和操作工具,其中ToLookup()方法是Linq中的一个用于将集合转换为Lookup
ToLookup()方法概述
ToLookup()方法是对IEnumerable
ToLookup()方法的语法如下:
public static ILookup<TKey, TSource> ToLookup<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector);
public static ILookup<TKey, TSource> ToLookup<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer);
public static ILookup<TKey, TElement> ToLookup<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector);
public static ILookup<TKey, TElement> ToLookup<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, IEqualityComparer<TKey> comparer);
ToLookup()方法详解
根据ToLookup()方法的语法,我们可以分为4个重载版本。下面分别讲解这4个重载版本的作用。
ToLookup(Func keySelector)方法
这是ToLookup()方法的最简单的重载版本,它的作用是将源集合按照指定的键进行分组,并且返回Lookup
IEnumerable<string> strList = new List<string>
{
"apple", "banana", "cherry", "peach", "grape", "pear", "lemon"
};
现在我们想将这些字符串按照首字母进行分组,可以使用ToLookup()方法,代码如下:
var lookup = strList.ToLookup(s => s[0]);
这样就会得到如下的分组结果:
a: apple
b: banana
c: cherry
p: peach, pear
g: grape
l: lemon
ToLookup(Func keySelector, IEqualityComparer comparer)方法
这个重载版本是在第一个版本的基础上增加了一个用于比较键值的comparer参数,如果键值相同但是comparer不同,那么就会返回不同的Lookup
IEnumerable<string> strList = new List<string>
{
"apple", "banana", "cherry", "peach", "grape", "pear", "lemon"
};
现在我们想用不区分大小写的方式对字符串进行分组,可以使用ToLookup()方法,并指定一个不区分大小写的比较器,代码如下:
var lookup = strList.ToLookup(s => s[0], StringComparer.OrdinalIgnoreCase);
按照首字母分组后得到的结果与前面相同,只不过键的比较是不区分大小写的。
ToLookup(Func keySelector, Func elementSelector)方法
这个重载版本是在第一个版本的基础上增加了一个elementSelector参数,用于对每个元素进行转换。例如,我们有如下学生列表:
IEnumerable<Student> students = new List<Student>
{
new Student { Name = "David", Age = 20, Gender = "Male" },
new Student { Name = "Mary", Age = 18, Gender = "Female" },
new Student { Name = "Tom", Age = 20, Gender = "Male" },
new Student { Name = "Sue", Age = 22, Gender = "Female" },
new Student { Name = "Bob", Age = 18, Gender = "Male" },
new Student { Name = "Lucy", Age = 22, Gender = "Female" },
};
现在我们想按照学生的年龄分组,并只显示学生的姓名,可以使用ToLookup()方法,并指定一个elementSelector参数,代码如下:
var lookup = students.ToLookup(s => s.Age, s => s.Name);
这样就会得到如下的分组结果:
18: Mary, Bob
20: David, Tom
22: Sue, Lucy
ToLookup(Func keySelector, Func elementSelector, IEqualityComparer comparer)方法
这个重载版本是在第三个版本的基础上增加了一个用于比较键值的comparer参数,同样是为了提供更灵活的比较方式。例如,我们有如下学生列表:
IEnumerable<Student> students = new List<Student>
{
new Student { Name = "David", Age = 20, Gender = "Male" },
new Student { Name = "Mary", Age = 18, Gender = "Female" },
new Student { Name = "Tom", Age = 20, Gender = "Male" },
new Student { Name = "Sue", Age = 22, Gender = "Female" },
new Student { Name = "Bob", Age = 18, Gender = "Male" },
new Student { Name = "Lucy", Age = 22, Gender = "Female" },
};
现在我们想用不区分大小写的方式对学生按照年龄分组,只显示姓名,可以使用ToLookup()方法,并指定一个elementSelector参数和一个不区分大小写的比较器,代码如下:
var lookup = students.ToLookup(s => s.Age, s => s.Name, EqualityComparer<int>.Default);
这样就会得到如下的分组结果:
18: Mary, Bob
20: David, Tom
22: Sue, Lucy
总结
在本文中,我们详细讲解了C#Linq中ToLookup()方法,提供了4个重载版本的解释,并给出了至少两个示例说明。ToLookup()方法可以将集合按照指定的键分组,并返回Lookup
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# Linq的ToLookup()方法 – 将序列转换为查找表 - Python技术站