第一个有效的例子:
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));
我知道这是错的,但是为了更好的理解而把它放在这里。 我希望有人能告诉我正确的道路: - )
此致 马里乌什
答案 0 :(得分:6)
您可以按如下方式执行inner join:
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 });
答案 1 :(得分:3)
您可以使您的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));
答案 2 :(得分:2)
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)
答案 3 :(得分:2)
尝试
list2.Where(c => list1.Any(d => d.ID == c.ID));
你需要使用自己的代码枚举其他集合以获得你想要的东西,因为.Contains使用.Equals函数,对象只会与引用匹配。