如何用非查询表达式的LINQ GroupBy过滤重复GroupId/UserId对象?
用GroupBy过滤重复的GroupId/UserId组合
你之前的代码问题出在分组键只选了GroupId,但我们要去重的是GroupId + UserId的组合对,所以得把这两个字段一起作为分组的依据才行。
先给你直接上可运行的代码,假设你的集合元素是一个叫GroupUser的类(包含GroupId和UserId属性):
// 假设groupUsers是你的原始群组用户集合 var distinctGroupUsers = groupUsers // 核心:用GroupId和UserId的匿名类型作为分组键,把重复的组合归为一组 .GroupBy(x => new { x.GroupId, x.UserId }) // 每组取第一个元素(组里的元素都是重复项,取任意一个都可以) .Select(g => g.First()) .ToList();
如果你想严格用你一开始尝试的那个带三个参数的GroupBy重载,也可以这么写:
var groupByResults = groupUsers .GroupBy( // 第一个参数:分组键,必须是GroupId+UserId的组合 keySelector: x => new { x.GroupId, x.UserId }, // 第二个参数:保留整个GroupUser对象作为分组元素 elementSelector: x => x, // 第三个参数:从每组取一个元素完成去重 resultSelector: (key, group) => group.First() ) .ToList();
逻辑说明
- 匿名类型
new { x.GroupId, x.UserId }会自动对比两个属性的值,只有当两者完全相同时,才会被分到同一个分组中。 - 每个分组里的元素都是重复的
GroupUser对象,所以取First()(或Last(),只要每组至少有一个元素即可)就能得到唯一的那一行。
这样处理后,你的集合里就不会存在重复的GroupId/UserId组合了。
内容的提问来源于stack exchange,提问作者user9393635
相关产品推荐
相关产品推荐

