C#:如何在分组Select语句中动态初始化List类型属性?
解决方案
首先明确:你遇到的Add()赋值失败问题,根源是List<T>.Add()方法返回void,无法直接赋值给List<T>类型的属性。针对你在LINQ分组查询中需要一行初始化ActivityList的场景,有以下可行方案:
直接使用Take(3)+ToList()完成初始化
在分组查询的Select语句中,直接对分组grp取前3个元素,映射为Activity对象后转成List<Activity>,一行代码即可完成赋值:
var grps = from d in result1 group d by d.CommissionId into grp select new RegistrationStatisticViewModel() { CommissionId = grp.Key, // 取分组前3个元素,映射为Activity后转为List ActivityList = grp.Take(3) .Select(item => new Activity { // 根据实际需求映射属性,示例如下: Code = item.Code, ActivityId = item.ActivityId }) .ToList(), CommissionCode = grp.First().CommissionCode, CommissionDescription = grp.First().CommissionDescription, MinuteWorked = grp.First().MinuteWorked, ActivityId = grp.First().ActivityId, UserId = grp.First().UserId }; return grps;
关键说明:
Take(3)会从分组中获取前3个元素(对应你需求的[0]、[1]、[2]),如果分组元素不足3个,会自动取现有所有元素,适配你“无法确定列表元素数量”的场景。Select(item => new Activity { ... })负责将分组中的原对象转换为Activity类型对象,你需要根据实际属性对应关系调整映射逻辑。ToList()直接将枚举序列转换为List<Activity>,可直接赋值给ActivityList属性,完全满足在Select中一行完成赋值的要求。
备选方案:集合初始化器(适用于明确元素的场景)
如果后续遇到需要指定具体元素的场景,也可以用集合初始化器一行完成:
ActivityList = new List<Activity> { new Activity { Code = smth.code }, new Activity { Code = another.code } }
此方案不适用于你当前动态取分组元素的场景,仅作补充参考。
内容的提问来源于stack exchange,提问作者ludodev69
相关产品推荐
相关产品推荐

