【问题标题】:Except Lambda expression also filters duplicates除了 Lambda 表达式还过滤重复项
【发布时间】:2016-01-20 06:38:44
【问题描述】:

如果我正确理解了 except lambda 的行为,它应该返回 col1 中存在的所有项目,而不是 col2 中的所有项目。 在下面的示例中,它应该返回具有空 ID 的两个项目。 问题:它只返回一个 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);
    }
}

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

我错过了什么?

谢谢你, 塞巴斯蒂安

【问题讨论】:

    标签: c# lambda except


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-23
      • 1970-01-01
      • 2016-10-23
      • 2018-06-07
      相关资源
      最近更新 更多