LINQ设置操作不起作用(相交,除外)

时间:2011-01-28 07:06:21

标签: c# linq intersection

我想使用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查询的结果,以防信息有所帮助......

1 个答案:

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