C# Linq的ToLookup()攻略
1. ToLookup()方法介绍
ToLookup()
是C# Linq中的一个方法,它可以将一个序列分组,并返回一个ILookup<TKey, TElement>
类型的结果。ILookup<TKey, TElement>
是一个字典,它将一个键映射到一个序列的集合。
其方法定义为:
ILookup<TKey, TElement> ToLookup<TKey, TElement>(this IEnumerable<TElement> source, Func<TElement, TKey> keySelector);
其中,source
表示要分组的序列,keySelector
表示用于从序列中选择键的函数。
2. ToLookup()方法示例说明
示例1:按照某一属性分组
考虑一个包含学生姓名和年龄的类Student
,现在我们希望将这些学生按照年龄进行分组。示例代码如下:
class Student
{
public string Name { get; set; }
public int Age { get; set; }
}
//...
List<Student> students = new List<Student>
{
new Student { Name = "张三", Age = 18 },
new Student { Name = "李四", Age = 20 },
new Student { Name = "王五", Age = 18 },
new Student { Name = "赵六", Age = 20 },
};
var lookup = students.ToLookup(s => s.Age);
foreach (var group in lookup)
{
Console.WriteLine($"年龄为{group.Key}的学生有:");
foreach (var student in group)
{
Console.WriteLine($"\t{student.Name}");
}
}
输出结果如下:
年龄为18的学生有:
张三
王五
年龄为20的学生有:
李四
赵六
可以看到,通过ToLookup()
方法,我们将学生按年龄进行了分组,并且每个分组都被封装成了一个IGrouping<int, Student>
类型的对象,其中group.Key
表示这个分组所对应的年龄,group
本身就是一个IEnumerable<Student>
类型的序列。
示例2:一对多关系的分组
考虑一个类Category
表示一个分类,而每个分类下又有多个商品,我们希望将所有商品按照分类进行分组。示例代码如下:
class Category
{
public string Name { get; set; }
}
class Product
{
public string Name { get; set; }
public Category Category { get; set; }
}
//...
List<Product> products = new List<Product>
{
new Product { Name = "洗面奶", Category = new Category { Name = "化妆品" } },
new Product { Name = "防晒霜", Category = new Category { Name = "化妆品" } },
new Product { Name = "苹果", Category = new Category { Name = "水果" } },
new Product { Name = "香蕉", Category = new Category { Name = "水果" } },
new Product { Name = "篮球", Category = new Category { Name = "运动器材" } },
};
var lookup = products.ToLookup(p => p.Category);
foreach (var group in lookup)
{
Console.WriteLine($"分类为{group.Key.Name}的商品有:");
foreach (var product in group)
{
Console.WriteLine($"\t{product.Name}");
}
}
输出结果如下:
分类为化妆品的商品有:
洗面奶
防晒霜
分类为水果的商品有:
苹果
香蕉
分类为运动器材的商品有:
篮球
可以看到,通过ToLookup()
方法,我们将商品按照分类进行了分组,并且每个分组都被封装成了一个IGrouping<Category, Product>
类型的对象,其中group.Key
表示这个分组所对应的分类,group
本身依然是一个IEnumerable<Product>
类型的序列。
3. 总结
ToLookup()
方法是C# Linq的一个非常强大的分组函数,可以方便地将序列按照某一属性进行分组。我们可以通过一些示例代码的说明,更好地理解这个方法的用法。