C# Linq的ToLookup()方法 – 将序列转换为查找表

  • Post category:C#

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的一个非常强大的分组函数,可以方便地将序列按照某一属性进行分组。我们可以通过一些示例代码的说明,更好地理解这个方法的用法。