您好,欢迎来到五一七教育网。
搜索
您的当前位置:首页C#基础:使用Linq进行简单分组处理(反射/方法/Linq分组)

C#基础:使用Linq进行简单分组处理(反射/方法/Linq分组)

来源:五一七教育网


一、反射分组

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;
        }
    }
}

六、多个分组组合的写法

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 517ttc.cn 版权所有 赣ICP备2024042791号-8

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务