检查列表中的每个对象是否存在于另一个列表中

时间:2013-12-10 12:46:42

标签: linq c#-4.0

我有两个相同类的列表:

class Test
{
int A;
String B;
Char C;
}

Element of two lists are:

List<Test> obj1 :

1   “Abc”   'a'
2   “Bcd”   'b'

List<Test> obj2:

1   “Abc”   'a'
2   “Bcd”   'b'
3   “Cde”   'c'
4   “Def”   'd'
5   “Efg”   'e'

我想检查obj2中是否存在obj1行。例如,前两行obj1在obj2中。我用循环实现了这一点。任何人都可以通过linq查询或没有循环帮助我做同样的事情。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

如果您的列表共享相同的对象实例(您可以查看@ lazyberezovsky的帖子以覆盖EqualsGetHashCode方法),则可以使用LINQ Any。如果true中的项目位于obj1

,则会返回obj2
obj1.Any(obj => obj2.Contains(obj));

修改

如果我误解了您(正如某些评论者建议的那样)并且您想要检查obj1中是否存在obj2中的所有对象,您可以使用LINQ All。如果true中存在obj1中的所有项目,则会返回obj2

obj1.All(obj => obj2.Contains(obj));

答案 1 :(得分:3)

如果您不想覆盖EqualsGetHashCode,或者为对象创建自定义比较器,则可以将两个列表都投影到匿名对象中:

obj1.Select(t => new { t.A, t.B, t.C })
    .Except(obj2.Select(t => new { t.A, t.B, t.C })
    .Any();

如果您的列表共享相同的对象实例,则只需(它将按引用比较对象)

obj1.Except(obj2).Any()

如果您要在课程中添加EqualsGetHashCode实施,则可以使用此方法(请参阅下面的实施示例)。您还可以为测试类创建比较器:

public class TestComparer : IEqualityComparer<Test>
{
    public bool Equals(Test x, Test y)
    {
        return (x.A == y.A) && (x.B == y.B) && (x.C == y.C);
    }

    public int GetHashCode(Test obj)
    {
        int hash = 19;
        hash = hash * 17 + obj.A.GetHashCode();
        hash = hash * 17 + obj.B.GetHashCode();
        hash = hash * 17 + obj.C.GetHashCode();
        return hash;
    }
}

并将此比较器传递给重载的Except方法:

obj1.Except(obj2, new TestComparer()).Any()