基于另一个集合中的值对集合进行过滤

3
我有一个整数数组和一个包含整数ID的对象列表。
如果整数数组包含1、2、3等,我只想获取包含这些ID的对象(即包含1、2、3等)。
在.NET 3.5中应该如何实现?
谢谢
3个回答

8

DaveShaw的答案针对小序列是可以的。如果您的ID数组增长得更大,更高效的方法是将数组加载到HashSet<T>中,然后执行完全相同的查询,只不过使用集合而不是数组。

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

4
假设objects是您的类实例列表,它们具有Id属性,则可以按以下方式执行该操作。
var ints = new[] {1, 2, 3, };
var matches = objects.Where(obj => ints.Contains(obj.Id));

-1

除了where方法之外,另一种选择可能是这样的:

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

这个项目将对象投射到整数,然后执行交集操作。只是一种不同的方法。


1
这不会返回一个ID的集合,而不是对象的集合吗? - Henry
此外,对于数组而言,使用.Contains()方法比使用.Intersect()方法更高效,因为它不需要为结果创建新的Set。 - DaveShaw

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