C# List如何实现分组功能

发布时间:2023-05-17

一、分组简介

在实际开发中,我们经常会遇到需要将数据按照某个规则进行分组的情况,比如根据学校进行成绩排名、根据省份进行广告投放等等。如果使用传统的方式,可能需要编写很多繁琐冗长的代码。而C#的List类提供了很方便的分组功能,可以大大简化我们的开发流程。

二、分组实现

1、根据单个属性分组

在List中,我们可以使用GroupBy方法进行分组,传入一个lambda表达式作为分组依据,以下是根据一个Person类中的Age属性进行分组的示例代码:

List<Person> persons = new List<Person>();
//添加数据
var groups = persons.GroupBy(p => p.Age);
foreach (var group in groups)
{
    Console.WriteLine("Age Group: " + group.Key);
    foreach (var person in group)
    {
        Console.WriteLine("\t" + person.Name);
    }
}

上面的示例代码中,Age属性作为分组依据,GroupBy方法返回的是一个以Age为键、以Person列表为值的字典。

2、根据多个属性分组

如果需要根据多个属性进行分组,可以在lambda表达式中使用匿名类型作为分组依据,以下是根据一个Person类中的AgeGender属性进行分组的示例代码:

List<Person> persons = new List<Person>();
//添加数据
var groups = persons.GroupBy(p => new { p.Age, p.Gender });
foreach (var group in groups)
{
    Console.WriteLine("Age and Gender Group: " + group.Key.Age + ", " + group.Key.Gender);
    foreach (var person in group)
    {
        Console.WriteLine("\t" + person.Name);
    }
}

上面的示例代码中,使用了一个包含AgeGender属性的匿名类型作为分组依据,GroupBy方法返回的是一个以该匿名类型为键、以Person列表为值的字典。

3、根据简单对象分组

除了基本类型和匿名类型外,我们还可以使用自定义类型进行分组。只需要让自定义类型实现IEqualityComparer接口并重写EqualsGetHashCode方法即可。以下是根据一个自定义的Student类进行分组的示例代码:

public class Student
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string Province { get; set; }
    public class GroupComparer : IEqualityComparer<Student>
    {
        public bool Equals(Student x, Student y)
        {
            return x.Province.Equals(y.Province);
        }
        public int GetHashCode(Student obj)
        {
            return obj.Province.GetHashCode();
        }
    }
}
List<Student> students = new List<Student>();
//添加数据
var groups = students.GroupBy(s => s, new Student.GroupComparer());
foreach (var group in groups)
{
    Console.WriteLine("Province Group: " + group.Key.Province);
    foreach (var student in group)
    {
        Console.WriteLine("\t" + student.Name);
    }
}

三、小结

以上就是C# List实现分组功能的三种方法,分别根据单个属性分组、根据多个属性分组以及根据自定义类型进行分组。使用这些方法可以很方便地对数据进行分类统计和分析。在实际开发中,我们需要灵活运用这些方法,根据不同的需求来选择合适的分组方式。