我有一个int整数和一个包含int ID的对象列表。基于另一个集合中的值筛选集合
如果整数数组包含1,2,3等,我只想获得包含这些ID的对象(所以那些具有1,2,3等)。
这怎么可能在.NET 3.5中完成?
感谢
我有一个int整数和一个包含int ID的对象列表。基于另一个集合中的值筛选集合
如果整数数组包含1,2,3等,我只想获得包含这些ID的对象(所以那些具有1,2,3等)。
这怎么可能在.NET 3.5中完成?
感谢
DaveShaw的answer很好,如果你正在处理小序列。如果您的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);
假设objects
的是,有一个Id
财产类的实例的列表,你可以像下面这样做。
var ints = new[] {1, 2, 3, };
var matches = objects.Where(obj => ints.Contains(obj.Id));
到the where approach另一种可能是这样的:
var ints = new[] {1, 2, 3, };
var matches = ints.Intersect(objects.Select(obj => obj.Id));
该项目的对象整数,然后执行相交设置操作。只是一种不同的方法。
这不是返回一个ID集合,而是一组对象吗? – Henry 2012-03-09 13:15:57
woops。误解了这个问题。你是对的。 – Foo42 2012-03-09 13:17:22
另外,数组上的.Contains()应该比.Intersect()更有效,因为它不需要为结果创建新的Set。 – DaveShaw 2012-03-09 13:21:42