如何使用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();
逻辑说明
- 合并列表:用
Concat将两个列表合并为一个集合; - 分组去重:按
FormTypeId和RoleId的组合分组,确保同一表单类型下的相同角色ID项被归为一组(如果你的场景中FormTypeId固定,也可仅按RoleId分组,但保留双字段分组更严谨); - 聚合布尔属性:对每组中的布尔属性,用
Any判断组内是否存在任意项为true,只要有一个为true就返回true,完全匹配你“任一列表中布尔属性为True就保留True”的要求; - 生成结果:将分组后的聚合结果映射为新的
FormTypeRoleLinkDto对象,最终转为列表。
最终结果
执行代码后,mergedList的内容如下:
| FormTypeId | RoleId | CanBeAddedOn | CanBeAddedBy |
|---|---|---|---|
| 1 | 1 | True | True |
| 1 | 2 | True | False |
| 1 | 3 | True | False |
完全符合预期:RoleId无重复,布尔属性只要任一列表为True则保留True。
内容的提问来源于stack exchange,提问作者Hannah Hayes
相关产品推荐
相关产品推荐

