首页 > 编程语言 >C# List 根据传入的分组字段,动态分组

C# List 根据传入的分组字段,动态分组

时间:2024-04-09 15:02:58浏览次数:20  
标签:groupingKeySelector group groupingSelectorKeys C# IEnumerable List 分组 GroupBy

 

动态分组:

public static class DynamicLinqExtensions
{
    /// <summary>
    /// 分组查询
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="source">数据源</param>
    /// <param name="groupingSelectorKeys">动态指定的列</param>
    /// <param name="groupingKeySelector">所有列的 Lambda 表达式集合</param>
    /// <returns></returns>
    public static IEnumerable<Group<T>> GroupBy<T>(this IEnumerable<T> source, IEnumerable<string> groupingSelectorKeys, Dictionary<string, Func<T, object>> groupingKeySelector)
    {
        var groupedResult = Enumerable.Empty<Group<T>>();
        if (groupingSelectorKeys.Any())
        {
            string selectorType = groupingSelectorKeys.First();
            var selector = groupingKeySelector[selectorType];


            IEnumerable<string> nextSelectorTypes = groupingSelectorKeys.Skip(1);
            groupedResult = source.GroupBy(selector).Select(group =>
            {
                Group<T> newGroup = new Group<T>
                {
                    Type = selectorType,
                    Value = group.Key?.ToString(),
                    Items = group.Select(x => x),
                };
                newGroup.SubGroup = group.GroupBy(nextSelectorTypes, groupingKeySelector);
                return newGroup;
            });
        }

        return groupedResult;
    }
}
View Code

 

 Dictionary<string, Func<VOIODashboardDto, object>> groupingKeySelector = new Dictionary<string, Func<VOIODashboardDto, object>>();
 groupingKeySelector["Brand"] = x => x.Brand;
 groupingKeySelector["Category"] = x => x.Category;
 // 定义要根据哪些属性进行分组  
 string[] groupByProperties = { "Category", "Brand" };
 var groupList = list.GroupBy(groupByProperties, groupingKeySelector);

 

标签:groupingKeySelector,group,groupingSelectorKeys,C#,IEnumerable,List,分组,GroupBy
From: https://www.cnblogs.com/SmilePastaLi/p/18123968

相关文章

  • MyBatis中如果某个查询不希望使用缓存,可以在映射文件中的select语句上设置flushCache=
    <selectid="xmlGetGuaranteeCount"databaseId="sqlserver"resultType="Integer"flushCache="true"><![CDATA[SELECTcount(appisparea.ID)FROMT_APP_ISP_ARE......
  • Idea 的 Ctrl + Shift + F 快捷键失效
    失效的原因:是因为微软输入法或安装的其他输入法(比如搜狗输入法)的"简繁"切换的快捷键冲突了解决方案:设置搜狗输入法的"简繁"快捷键,把"简繁"快捷键换成其他,不要用Ctrl+Shift+F1、微软输入法:快捷键修改如下(1)右键点击微软输入法进入设置 2、搜狗输入法:快捷键修改......
  • SRD-12VDC-SL-C 功率继电器
    TL431ACLPR规格信息:制造商:TexasInstruments产品种类:参考电压RoHS:是安装风格:ThroughHole封装/箱体:TO-92-3参考类型:ShuntAdjustablePrecisionReferences输出电压:Adjustable初始准确度:1%温度系数:92PPM/C串联VREF—输入电压—最大值:37V分流电流......
  • 【C语言】练习:分数求和
    计算1/1-1/2+1/3-1/4+1/5……+1/99-1/100的值,打印出结果首先看题,分子不变为1,分母1-100;既然是分数计算,那结果肯定存在小数,所以在开始定义一个double类型的变量“num”;初始化一个int类型的变量“i”,使用for循环产出1-100的值;在for循环里使用if语句来判断分母是偶数......
  • C语言语法最后一个教案-教案21(预处理 · 头文件)
    最近给大家争取到一个深夜福利保证你在深夜手机刷到嘎嘎香~那就是 官方授权大流量卡缺点:月租太便宜 185GB~100分钟通话时长~长期套餐~畅想自由的气息流量自由的同时还拥有超长通话,而且免费领取。名额有限,咱们废话不多说直接上图。感兴趣的家人私我或者直接加微......
  • @行业应用:德国ARIS Nano S-DC 10-03电动执行器
    @行业应用:德国ARISNanoS-DC10-03电动执行器@行业应用:德国ARISNanoS-DC10-03电动执行器@行业应用:德国ARISNanoS-DC10-03电动执行器LinearisN+机电阻尼器执行器LinearisN+将zuixianjin的和用户友好的线性技术与当代设计中的经典驱动技术相结合。带有dryspin......
  • java 对Map<String, Object>遍历
    在Java中,你可以使用多种方法来遍历Map<String,Object>。以下是一些常见的方法:使用Map.Entry和IteratorjavaMap<String,Object>map=newHashMap<>();//添加一些键值对到map中Iterator<Map.Entry<String,Object>>iterator=map.entrySet().iterator();while(iterator.ha......
  • 布局升级秘籍:掌握CSS Grid网格布局,打造响应式网页设计
    随着现代网页设计的不断演进,传统的布局方式已经逐渐不能满足设计师和开发者们对于高效、灵活且强大布局系统的追求。而CSSGrid网格布局,正是在这样的背景下应运而生的。今天,我们就来深入探讨CSSGrid布局的魅力所在,带你解锁这项强大的设计工具,让网页布局变得更加简单和高效。......
  • 丐版pxc集群
    同步systemctlstopfirewalld&&systemctldisablefirewalldsystemctlstopNetworkManager&&systemctldisableNetworkManagersetenforce0sed-is/SELINUX=enforcing/SELINUX=disabled//etc/selinux/configswapoff-ased-ri's/.swap./......
  • Qt加Opencv实现 梯度矫正 功能
    废话:有时候我们是从物品的斜上方拍摄的图片,看起来不直观,需要把视角拉正,这样的一个操作就叫做梯度矫正,需要用到的技术是Opencv的透视变换。这个只是一个简单的演示demo,如果完善一下,比如物品检测,可以应用更多的场景,比如常见的:文件、资料上传,软管摄像头的应用等,怎么说也是一个......