一、反射分组
private static List<GroupList<T>> GetGroupList<T>(List<T> entities, string groupByProperty)
{
// 获取分组字段的类型
var propertyInfo = typeof(T).GetProperty(groupByProperty);
if (propertyInfo == null)
{
throw new ArgumentException($"类型 {typeof(T).Name} 不包含名为 {groupByProperty} 的属性.");
}
// 按指定属性分组
var groupedEntities = entities.GroupBy(e => propertyInfo.GetValue(e, null));
// 创建分组列表
List<GroupList<T>> groupLists = new List<GroupList<T>>();
foreach (var group in groupedEntities)
{
GroupList<T> groupList = new GroupList<T>
{
GroupKey = group.Key.ToString(), // 使用分组键作为GroupKey
List = group.ToList(), // 分组数据
//Count = group.Count() //每组数据条数
};
groupLists.Add(groupList);
}
return groupLists;
}
二、方法分组
private static List<GroupListStudent> GetGroupListSimple(List<Student> entities)
{
// 根据班级分组
var groups = entities.GroupBy(s => s.ClassNumber);
// 创建分组列表
var groupLists = new List<GroupListStudent>();
foreach (var group in groups)
{
var groupList = new GroupListStudent
{
GroupKey = group.Key.ToString(),
List = group.ToList()
//List = group.Select(x=>new Student { Name=x.Name,ClassNumber=x.ClassNumber }).ToList()//按需选择列表数据
// Count = group.Count()
};
groupLists.Add(groupList);
}
return groupLists;
}
三、LINQ分组(推荐)
//LINQ直接获取分组
var result3 = Students
.GroupBy(s => s.ClassNumber)
.Select(list => new GroupListStudent //也可以写成new GroupList<Student> 实体见下面
{
GroupKey = list.Key.ToString(),
List = list.ToList()
//List = list.Select(x=>new Student { Name=x.Name,ClassNumber=x.ClassNumber }).ToList()//按需选择列表数据
// Count = list.Count() //查此组总数
// Max = list.Max(x=>x.Ident) //查此组Ident字段最大值
})
.ToList();
感谢大神网友指教,上述Select这里假如不new具体的实体也行,将result3作为匿名对象也可以访问到GroupKey和List。
四、调用示例
//反射获取分组
var result = GetGroupList(Students, "ClassNumber");
//直接获取分组
var result2 = GetGroupListSimple(Students);
五、代码demo
using System;
using System.Collections.Generic;
using System.Linq;
namespace StudentClassExample
{
// 学生类
public class Student
{
public string Name { get; set; }
public int ClassNumber { get; set; }
public int Age { get; set; }
}
public class GroupList<T>
{
public string GroupKey { get; set; }
public int Count { get => List.Count; }
public List<T> List { get; set; } = new List<T>();
}
public class GroupListStudent
{
public string GroupKey { get; set; }//必选,分组键(命名可以不同)
public int Count { get => List.Count; }//根据需要选择
public List<Student> List { get; set; } = new List<Student>();//可选其他实体列表
}
// 主程序
class Program
{
static void Main(string[] args)
{
// 创建1班的学生
List<Student> Students = new List<Student>
{
new Student { Name = "学生1-1", ClassNumber = 1, Age = 15 },
new Student { Name = "学生1-2", ClassNumber = 1, Age = 16 }
};
// 创建2班的学生
List<Student> class2Students = new List<Student>
{
new Student { Name = "学生2-1", ClassNumber = 2, Age = 17 },
new Student { Name = "学生2-2", ClassNumber = 2, Age = 16 },
new Student { Name = "学生2-3", ClassNumber = 2, Age = 15 }
};
Students.AddRange(class2Students);
//反射获取分组
var result = GetGroupList(Students, "ClassNumber");
//直接获取分组
var result2 = GetGroupListSimple(Students);
//LINQ直接获取分组
var result3 = Students
.GroupBy(s => s.ClassNumber)
.Select(list => new GroupListStudent
{
GroupKey = list.Key.ToString(),
List = list.ToList()
//List = list.Select(x=>new Student { Name=x.Name,ClassNumber=x.ClassNumber }).ToList()//按需选择列表数据
// Count = list.Count()
})
.ToList();
;
}
private static List<GroupList<T>> GetGroupList<T>(List<T> entities, string groupByProperty)
{
// 获取分组字段的类型
var propertyInfo = typeof(T).GetProperty(groupByProperty);
if (propertyInfo == null)
{
throw new ArgumentException($"类型 {typeof(T).Name} 不包含名为 {groupByProperty} 的属性.");
}
// 按指定属性分组
var groupedEntities = entities.GroupBy(e => propertyInfo.GetValue(e, null));
// 创建分组列表
List<GroupList<T>> groupLists = new List<GroupList<T>>();
foreach (var group in groupedEntities)
{
GroupList<T> groupList = new GroupList<T>
{
GroupKey = group.Key.ToString(), // 使用分组键作为GroupKey
List = group.ToList(), // 分组数据
//Count = group.Count() //每组数据条数
};
groupLists.Add(groupList);
}
return groupLists;
}
private static List<GroupListStudent> GetGroupListSimple(List<Student> entities)
{
// 根据班级分组
var groups = entities.GroupBy(s => s.ClassNumber);
// 创建分组列表
var groupLists = new List<GroupListStudent>();
foreach (var group in groups)
{
var groupList = new GroupListStudent
{
GroupKey = group.Key.ToString(),
List = group.ToList(),
// Count = group.Count()
//List = group.Select(x=>new Student { Name=x.Name,ClassNumber=x.ClassNumber }).ToList()//按需选择列表数据
};
groupLists.Add(groupList);
}
return groupLists;
}
}
}
六、多个分组组合的写法