如何用单个Linq操作移除特定UserType关联的所有短列表项?
实现移除包含指定UserType的整个短列表的Linq操作
当然可以用单个Linq操作实现需求,核心思路是先定位到所有包含UserType='U'的短列表,再排除这些列表中的所有项。具体实现取决于你用来标识“短列表”的属性(比如假设用GroupId来区分不同的短列表,同一短列表的项拥有相同的GroupId),以下提供两种常见方案:
方案一:分组过滤(性能更优)
先按短列表标识分组,过滤掉包含UserType='U'的分组,再展开剩余分组的所有项:
List<RolesAccessModel> result = roleAccess .GroupBy(item => item.GroupId) // 按短列表标识分组 .Where(group => !group.Any(item => item.UserType == 'U')) // 排除包含'U'的分组 .SelectMany(group => group) // 将分组展开为列表 .ToList();
方案二:直接过滤(代码更简洁,适合小数据量)
通过判断当前项所属的短列表是否存在UserType='U'的项,来决定是否保留:
List<RolesAccessModel> result = roleAccess .Where(item => !roleAccess.Any(other => other.GroupId == item.GroupId && other.UserType == 'U')) .ToList();
说明
- 替换代码中的
GroupId为你实际用来区分短列表的属性(比如MenuType,取值为PrimaryMenu/OptionMenu/Roles)即可适配你的数据结构。 - 方案一通过分组减少了重复遍历,数据量较大时性能更优;方案二更直观,适合数据量较小的场景。
内容的提问来源于stack exchange,提问作者Diego
相关产品推荐
相关产品推荐

