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

如何使用LINQ合并两个FormTypeRoleLinkDto列表并去重保留True值?

实现方案

当然可以实现这个需求,通过LINQ的分组与聚合操作就能完成,具体实现如下:

首先是你的DTO类:

public class FormTypeRoleLinkDto
{
    public int FormTypeId { get; set; }
    public int RoleId { get; set; }
    public bool CanBeAddedOn { get; set; }
    public bool CanBeAddedBy { get; set; }
}

假设两个列表的初始化代码如下:

var list1 = new List<FormTypeRoleLinkDto>
{
    new FormTypeRoleLinkDto { FormTypeId = 1, RoleId = 1, CanBeAddedOn = true, CanBeAddedBy = false },
    new FormTypeRoleLinkDto { FormTypeId = 1, RoleId = 2, CanBeAddedOn = true, CanBeAddedBy = false },
    new FormTypeRoleLinkDto { FormTypeId = 1, RoleId = 3, CanBeAddedOn = true, CanBeAddedBy = false }
};

var list2 = new List<FormTypeRoleLinkDto>
{
    new FormTypeRoleLinkDto { FormTypeId = 1, RoleId = 1, CanBeAddedOn = false, CanBeAddedBy = true }
};

合并逻辑的LINQ代码:

var mergedList = list1.Concat(list2)
                     .GroupBy(dto => new { dto.FormTypeId, dto.RoleId })
                     .Select(group => new FormTypeRoleLinkDto
                     {
                         FormTypeId = group.Key.FormTypeId,
                         RoleId = group.Key.RoleId,
                         CanBeAddedOn = group.Any(dto => dto.CanBeAddedOn),
                         CanBeAddedBy = group.Any(dto => dto.CanBeAddedBy)
                     })
                     .ToList();

逻辑说明

  1. 合并列表:用Concat将两个列表合并为一个集合;
  2. 分组去重:按FormTypeId和RoleId的组合分组,确保同一表单类型下的相同角色ID项被归为一组(如果你的场景中FormTypeId固定,也可仅按RoleId分组,但保留双字段分组更严谨);
  3. 聚合布尔属性:对每组中的布尔属性,用Any判断组内是否存在任意项为true,只要有一个为true就返回true,完全匹配你“任一列表中布尔属性为True就保留True”的要求;
  4. 生成结果:将分组后的聚合结果映射为新的FormTypeRoleLinkDto对象,最终转为列表。

最终结果

执行代码后,mergedList的内容如下:

FormTypeIdRoleIdCanBeAddedOnCanBeAddedBy
11TrueTrue
12TrueFalse
13TrueFalse

完全符合预期:RoleId无重复,布尔属性只要任一列表为True则保留True。

内容的提问来源于stack exchange,提问作者Hannah Hayes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 03:37:54