Linq和包含

时间:2011-08-25 21:49:33

标签: c# linq contains

第一个有效的例子:

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

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

此致 马里乌什

4 个答案:

答案 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函数,对象只会与引用匹配。