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));

我知道这是错误的,但把它放在这里更好地理解。我希望有人能告诉我正确的道路:-)

的问候科学家们

Linq and Contains

可以按照以下方式执行内部连接:

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)