问题:
改造集合分组:
改造前:
var list = new List<Student>();
list.Add(new Student(1, "陈兆杰", 10, "班级一"));
list.Add(new Student(2, "陈志杰", 10, "班级一"));
list.Add(new Student(3, "废纸杰拉德", 10, "班级二"));
list.Add(new Student(4, "马克吐恩", 12, "班级一"));
var groups = list.GroupBy(m => new { m.Age, m.Class });
改造后:
将匿名类改成class后,发现不能正常多字段分组统计了
var list = new List<Student>();
list.Add(new Student(1, "陈兆杰", 10, "班级一"));
list.Add(new Student(2, "陈志杰", 10, "班级一"));
list.Add(new Student(3, "废纸杰拉德", 10, "班级二"));
list.Add(new Student(4, "马克吐恩", 12, "班级一"));
var groups = list.GroupBy(m => new StudentKey
{
Age = m.Age,
Class = m.Class
});
class StudentKey
{
public int Age { get; set; }
public string Class { get; set; }
}
Class:
class Student
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public string Class { get; set; }
public Student(int id, string name, int age, string @class)
{
Id = id;
Name = name;
Age = age;
Class = @class;
}
public override string ToString()
{
return $"Id={Id},Name={Name},Age={Age},Class={Class}";
}
}
改造:
static void Main(string[] args)
{
var list = new List<Student>();
list.Add(new Student(1, "陈兆杰", 10, "班级一"));
list.Add(new Student(2, "陈志杰", 10, "班级一"));
list.Add(new Student(3, "废纸杰拉德", 10, "班级二"));
list.Add(new Student(4, "马克吐恩", 12, "班级一"));
Console.WriteLine("********************解决方法一 分割线******************");
{
var groups = list.GroupBy(m => new NewStudentKey
{
Age = m.Age,
Class = m.Class
});
foreach (var group in groups)
{
Console.WriteLine("分组值 Age:{0},Class:{1}", group.Key.Age, group.Key.Class);
foreach (var student in group)
{
Console.WriteLine(student);
}
}
}
Console.WriteLine("********************解决方法二 分割线******************");
//方法一方式,最大的区别在于不用侵入实体类添加代码
{
var groups = list.GroupBy(m => new StudentKey { Age = m.Age, Class = m.Class }, new StudentKeyComparer());
foreach (var group in groups)
{
Console.WriteLine("分组值 Age:{0},Class:{1}", group.Key.Age, group.Key.Class);
foreach (var student in group)
{
Console.WriteLine(student);
}
}
}
Console.ReadKey();
}
class NewStudentKey : IEquatable<NewStudentKey>
{
public int Age { get; set; }
public string Class { get; set; }
public override int GetHashCode()
{
return Age.GetHashCode() ^ Class.GetHashCode();
}
public bool Equals(NewStudentKey other)
{
return Age == other.Age && Class == other.Class;
}
}
class StudentKeyComparer : IEqualityComparer<StudentKey>
{
public bool Equals(StudentKey x, StudentKey y)
{
return x.Age == y.Age && x.Class == y.Class;
}
public int GetHashCode(StudentKey obj)
{
return obj.Age.GetHashCode() ^ obj.Age.GetHashCode();
}
}