LINQ Set操作无法正常工作(相交,除外)
我想使用Uber-Coolness of LINQ set操作来表达以下内容:
foreach (Group group in groups) { if (user.Groups.Contains(group)) { assignedGroups.Add(group); } else { availableGroups.Add(group); } }
我认为它应该是一个双线实现这个:
var assigned = user.Groups.Intersect(groups); var available = groups.Except(user.Groups);
每当我运行此示例时,foreach方法正确填充我的列表,而set操作导致空的分配列表和填充的可用列表。 我认为它必须是关于等式检查的问题,但是Contains()工作的事实certificate这是错误的。 任何人都可以帮我看看我的误解吗?
IEnumerable 组也是LINQ查询的结果,以防信息有所帮助……
好吧,它应该没有什么区别,但从对称性的角度来看,我会反过来如何创建assigned
。 我还要确保查询只执行一次,其余操作在进程中发生:
var cachedGroups = groups.ToList(); var assigned = cachedGroups.Intersect(user.Groups); var available = cachedGroups.Except(user.Groups);
一种可能性是user.Groups
具有自定义相等比较器。 这可以解释为什么foreach版本有效,但LINQ版本没有。 user.Groups
的类型是user.Groups
,你对它使用的相等比较器了解多少?