一、分组简介
在实际开发中,我们经常会遇到需要将数据按照某个规则进行分组的情况,比如根据学校进行成绩排名、根据省份进行广告投放等等。如果使用传统的方式,可能需要编写很多繁琐冗长的代码。而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
类中的Age
和Gender
属性进行分组的示例代码:
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);
}
}
上面的示例代码中,使用了一个包含Age
和Gender
属性的匿名类型作为分组依据,GroupBy
方法返回的是一个以该匿名类型为键、以Person
列表为值的字典。
3、根据简单对象分组
除了基本类型和匿名类型外,我们还可以使用自定义类型进行分组。只需要让自定义类型实现IEqualityComparer
接口并重写Equals
和GetHashCode
方法即可。以下是根据一个自定义的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实现分组功能的三种方法,分别根据单个属性分组、根据多个属性分组以及根据自定义类型进行分组。使用这些方法可以很方便地对数据进行分类统计和分析。在实际开发中,我们需要灵活运用这些方法,根据不同的需求来选择合适的分组方式。