根据另一个集合中的值过滤集合

时间:2012-03-09 13:03:50

标签: c# linq

我有一个int数组和一个包含int ID的对象列表。

如果int数组包含1,2,3等,我只想获取包含这些ID的对象(那些有1,2,3等的对象)。

如何在.NET 3.5中完成?

由于

3 个答案:

答案 0 :(得分:7)

如果你正在处理小序列,那么DaveShaw的answer就可以了。如果您的ID数组变大,更高效的方法是将数组加载到HashSet<T>然后执行完全相同的查询,除了使用set。

var hashset = new HashSet<int>(ints);
var matches = objects.Where(obj => hashset.Contains(obj.Id)); 

对于这个和其他更复杂的场景,您还应该了解基于键匹配两个序列的Enumerable.Join并产生所需的结果。

 var matches = from obj in objects 
               join id in ints
               on obj.Id equals id
               select obj;
 // var matches = objects.Join(ints, obj => obj.Id, id => id, (obj, id) => obj);

答案 1 :(得分:2)

假设objects是一个具有Id属性的类实例列表,您可以这样做。

var ints = new[] {1, 2, 3, };
var matches = objects.Where(obj => ints.Contains(obj.Id));

答案 2 :(得分:-1)

the where approach的替代方案可能是这样的:

var ints = new[] {1, 2, 3, };
var matches = ints.Intersect(objects.Select( obj => obj.Id));

将对象投影到整数,然后执行“相交集”操作。只是一种不同的方法。