基于另一个列表,使用Linq查询对象列表的结果

3
我有一个数字列表,如下所示:

1) List<long> list1 : 101, 102, 103

我有一个对象列表,其中一个属性是长整型:

2) List<SomeObject> list2: 
   SomeObject[0]- (long)Id : 101,
                  Name: Adam,
                  Address:xxx
   SomeObject[1]- (long)Id : 102,
                  Name: Bran,
                  Address:xxx
   SomeObject[2]- (long)Id : 109,
                  Name: Queen,
                  Address:yyy

我希望查询第二个列表中是否存在列表1中的Id。意思是我应该得到一个包含以下内容的列表:
SomeObject[0]  
SomeObject[1]

尝试以下代码,但未成功:
(from t2 in list2
          where list1 .Any(t => t2.Id.Contains(t)) == true
          select t2);

提前致谢。

3个回答

5
您可以使用Enumerable.Contains
var query = from t2 in list2
            where list1.Contains(t2.Id)
            select t2;

如果list1中的值是唯一的,您还可以使用更高效的Join方法:(参考链接)
var query = from t2 in list2
            join t1 in list1
            on t2.Id equals t1
            select t2;

您的方案不可行:
where list1.Any(t => t2.Id.Contains(t)) == true

因为 t2.Id 返回的是一个没有 Contains 方法的 long 类型。

如果您想使用 Any,可以使用以下方法:

where list1.Any(t => t2.Id == t)

1
也许您还可以解释一下为什么OP的方法不起作用。毕竟,他确实使用了Contain - Lumen
1
@TimSchmelter t 也是一个 long,但他没有检查 tId。他检查的是 t2Id,而 t2 是一个有 IdSomeObject - Ivan Yurchenko

1
你的问题在于你试图在一个 long 上调用 Contains。正确的方式应该是 list1.Any(t => t2.Id == t)。但你也可以使用联接操作来解决问题。
from t1 in list1
join t2 in list2 on t1 equals t2.Id
select t2

1
您也可以使用下面的代码片段来获取所需的结果,其中
var result = list2.Where(l2 => list1.Any(l1 => l1 == l2.Id));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接