C#基础:数据库中使用Linq作分组处理(反射/直接分组)

目录

一、使用反射分组

二、不使用反射分组

三、调用示例

四、代码demo

一、使用反射分组
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 groupedStudents = entities.GroupBy(s => s.ClassNumber);

    // 创建分组列表
    List<GroupListStudent> groupLists = new List<GroupListStudent>();

    foreach (var group in groupedStudents)
    {
        GroupListStudent groupList = new GroupListStudent
        {
            GroupKey = group.Key.ToString(),
            List = group.ToList(),
           // Count = group.Count()
        };
        groupLists.Add(groupList);
    }
    return groupLists;
}
三、调用示例
//反射获取分组
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 Student(string name, int classNumber)
        {
            Name = name;
            ClassNumber = classNumber;
        }

    }

    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("学生1-1", 1),
                new Student("学生1-2", 1)
            };

            // 创建2班的学生
            List<Student> class2Students = new List<Student>
            {
                new Student("学生2-1", 2),
                new Student("学生2-2", 2),
                new Student("学生2-3", 2)
            };
            Students.AddRange(class2Students);
            //反射获取分组
            var result = GetGroupList(Students, "ClassNumber");
            //直接获取分组
            var result2 = GetGroupListSimple(Students);
            ;
        }

        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 groupedStudents = entities.GroupBy(s => s.ClassNumber);

            // 创建分组列表
            List<GroupListStudent> groupLists = new List<GroupListStudent>();

            foreach (var group in groupedStudents)
            {
                GroupListStudent groupList = new GroupListStudent
                {
                    GroupKey = group.Key.ToString(),
                    List = group.ToList(),
                   // Count = group.Count()
                };
                groupLists.Add(groupList);
            }
            return groupLists;
        }
    }
}

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值