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 ,你对它使用的相等比较器了解多少?