相交不给出预期结果

时间:2013-10-02 20:18:30

标签: c# .net linq

在下面的代码中,如果我在L3上迭代,我希望有2个结果可用。然而,它只有一个结果,结果是具有Id = 9的objTest。我认为它应该是具有两个objtest s'Id = 9和Id = 10的结果集。

class Program
{
public class objTest 
{
    public int Value { get; set; }
    public bool On  { get; set; }
    public int Id { get; set; }
}
class PramComp : EqualityComparer<objTest>
{
    public override bool Equals(objTest x, objTest y)
    {
        return x.Value == y.Value;
    }
    public override int GetHashCode(objTest obj)
    {
        return obj.Value.GetHashCode();
    }
}
 static void Main(string[] args)
{
    List<objTest> L1 = new List<objTest>();
    L1.Add(new objTest { Value = 1, On = true ,Id =1});
    L1.Add(new objTest { Value = 2, On = false ,Id =2});
    L1.Add(new objTest { Value = 3, On = false, Id = 3 });
    L1.Add(new objTest { Value = 4, On = false ,Id =4});
    L1.Add(new objTest { Value = 5, On = false ,Id =5});

    List<objTest> L2 = new List<objTest>();
    L2.Add(new objTest { Value = 6, On = false ,Id =6});
    L2.Add(new objTest { Value = 7, On = false ,Id=7});
    L2.Add(new objTest { Value = 8, On = false,Id =8 });
    L2.Add(new objTest { Value = 1, On = true,Id =9 });
    L2.Add(new objTest { Value = 1, On = true, Id =10 });

    var L3 = L2.Intersect(L1, new PramComp());

}
}

如果我想返回两个结果Id = 9和Id = 10,我的代码出错了。 有人能告诉我我的错误在哪里吗?

3 个答案:

答案 0 :(得分:8)

Enumerable.Intersect旨在制作:

  

两个序列的集合交集。

“set”不允许重复值,这意味着您只能获得这两个值中的一个。

如果你想返回两个匹配的,你可以使用:

var L3 = L2.Where(item => L1.Any(one => one.Value == item.Value));

这将通过L2集合查找L1中具有任何匹配值的所有项目,但保留重复项

答案 1 :(得分:3)

顺便说一句,Reed Copsey已经指出了你的错误假设所在。但是,他链接两个列表的方式效率低下。 join形成dictioanry以配对元素,因此最好使用它:

var l3 = from e2 in L2
         join e1 in L1 on e1.Value equals e2.Value
         into grp
         where grp.Any()
         select e2;

答案 2 :(得分:0)

您的相等比较器比较Value属性,为什么id 9和id 10被认为是交集的相同元素。因此,只有一个共同点。