Linq and Contains
本文关键字:Contains and Linq | 更新日期: 2023-09-27 18:06:53
第一个成功的例子:
public class Test
{
public int ID;
public string Name;
}
List<int> list1 = Load1();
List<Test> list2 = Load2();
var query = list2.Where(c => list1.Contains(c.ID));
现在我想使用两个对象列表作为源,并获取成员ID具有相同值的对象列表。
List<Test> list1 = Load2();
List<Test> list2 = Load2();
下面不能编译:
var query = list2.Where(c => **list1.ID.Contains**(c.ID));
我知道这是错误的,但把它放在这里更好地理解。我希望有人能告诉我正确的道路:-)
的问候科学家们
可以按照以下方式执行内部连接:
var query = from x in list1
join y in list2 on x.ID equals y.ID
select new { x, y };
或
var query = list1.Join(list2,
x => x.ID,
y => y.ID,
(x, y) => new { x, y });
您可以使您的Test类相等:
public class Test : IEquatable<Test>
{
public int Id {get;set;}
public bool Equals(Test other)
{
return this.Id == other.Id;
}
}
那么就可以了:
list1.Where(item => list2.Contains(item));
Try
list2.Where(c => list1.Any(d => d.ID == c.ID));
你需要用你自己的代码枚举另一个集合来得到你想要的,因为。contains使用。equals函数,对于对象来说,它只会匹配引用。
enter code here
的简单版本是
var query = list2.Where(c=> list1.Select(l=>l.ID).Contains(c.ID))
或者你可以使用linq版本的内连接如果你没有重复
var query = list2.Join(list1,a=>a.ID,b=>b.ID,(a,b)=>a);
或者你可以使用System.Collections.Generic.IEQualityComparer
public class TestComparerer : IEqualityComparer<Test> {
bool IEqualityComparer<Test>.Equals(Test a, Test b) {
return a!=null && b!=null && a.ID.Equals(b.ID);
}
int IEqualityComparer<Test>.GetHashCode(Test a){
return a.ID.GetHashCode();
}
}
var query = list2.intersect(list1,new TestComparer());
最后,如果你在测试中重写Equals和GetHashCode(),你可以使它们具有可比性
public override bool Equals(object o) {
var other=o as Test;
return other!=null && this.ID==other.ID;
}
public override int GetHashCode() {
return ID.GetHashCode();
}
这也允许你设置list1.Intersect(list2)
或list2.Intersect(list1)