我想使用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操作导致空的分配列表和填充的可用列表。 我认为它必须是关于平等检查的问题,但包含()的事实证明这是错误的。 任何人都可以帮我看看我的误解吗?
IEnumerable 组也是LINQ查询的结果,以防信息有所帮助......
答案 0 :(得分:2)
嗯,它不应该有所作为,但从对称的角度来看,我会改变你创建assigned
的方式。我还要确保查询只执行一次,其余操作在进程中发生:
var cachedGroups = groups.ToList();
var assigned = cachedGroups.Intersect(user.Groups);
var available = cachedGroups.Except(user.Groups);
一种可能性是user.Groups
具有自定义相等比较器。 将解释为什么foreach版本有效,但LINQ版本没有。什么是user.Groups
的类型,你对它使用的相等比较器了解多少?