You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 17:06:26