2016-01-20 42 views
0

如果我正确理解了Except lambda的行为,它应该返回col1中的所有项目,但不是col2中的所有项目。 在下面的例子中,它应该返回带有空ID的两个项目。 问题:它返回只有一个项目有一个空ID ...除了Lambda表达式还过滤器重复

 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); 
    } 
} 

有没有解释这种行为。看来,除了拉姆达还过滤col1集合中具有相同ID的项目...

我错过了什么?

谢谢 塞巴斯蒂安

回答

0

这似乎是该方法如何工作。请参阅注释部分在MSDN documentation,虽然我不同意,它应该在文档

为了得到重复也可以更清楚地说我会去调用这样的:

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

我猜它可能尽管如此,在某些情况下会慢一些。