除了 Lambda 表达式还过滤重复项

Except Lambda expression also filters duplicates

如果我正确理解 Except lambda 的行为,它应该 return 所有项目都出现在 col1 而不是 col2 中。 在下面的示例中,它应该 returns 具有空 ID 的两个项目。 问题:return只有一个 ID 为空的项目...

        var col2 = new List<StaffSkill>
        {
            new StaffSkill { SkillID = "12" },
        };

        var col1 = new List<StaffSkill>
        {
            new StaffSkill { SkillID = "12" },
            new StaffSkill { SkillID = null },
            new StaffSkill { SkillID = null },
        };

        var res = col1.Except(col2);
        if (res.Any())
        {  }

StaffSkill 在哪里

public class StaffSkill
{
    public string SkillID { get; set; }

    protected bool Equals(StaffSkill other)
    {
        return string.Equals(SkillID, other.SkillID, StringComparison.OrdinalIgnoreCase);
    }

    public override bool Equals(object obj)
    {
        if (ReferenceEquals(null, obj)) return false;
        if (ReferenceEquals(this, obj)) return true;
        if (obj.GetType() != this.GetType()) return false;
        return Equals((StaffSkill) obj);
    }

    public override int GetHashCode()
    {
        return (SkillID != null ? StringComparer.OrdinalIgnoreCase.GetHashCode(SkillID) : 0);
    }
}

是否有对此行为的解释。似乎 Except lambda 也过滤了 col1 集合中具有相同 ID 的项目...

我错过了什么?

谢谢, 塞巴斯蒂安

这似乎是该方法的工作原理。请参阅 msdn documentation 中的评论部分,尽管我同意应该在文档中更清楚地说明它

为了获得重复项,我会这样打电话:

var res = col1.Where(q => !col2.Contains(q))

不过我想在某些情况下它可能会慢一些。