我有两个相同类的列表:
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查询或没有循环帮助我做同样的事情。任何帮助将不胜感激。
答案 0 :(得分:3)
如果您的列表共享相同的对象实例(您可以查看@ lazyberezovsky的帖子以覆盖Equals
和GetHashCode
方法),则可以使用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)
如果您不想覆盖Equals
和GetHashCode
,或者为对象创建自定义比较器,则可以将两个列表都投影到匿名对象中:
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()
如果您要在课程中添加Equals
和GetHashCode
实施,则可以使用此方法(请参阅下面的实施示例)。您还可以为测试类创建比较器:
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()