最终结果是我想使用.Where(t => someIntList.Contains(t.ID)).ToList()
. 我正在努力创造someIntList
.
到目前为止我所拥有的:List<Person> people = people.Where(p => p.isActive).ToList()
。我如何只归还List<int>
房产的p.ID
一部分?
或者有另一种方法来做包含(不写一个比较器类,因为我已经有一个用于另一个目的。
好吧,制作List<int>
很容易,Select
用于执行投影:
List<int> activeIds = people.Where(p => p.IsActive)
.Select(p => p.ID)
.ToList();
但是,我不会这样做然后使用Contains
,而是执行连接:
var activePeople = people.Where(p => p.IsActive);
var query = from person in otherList
join activePeople on person.ID equals activePeople.ID
select person;
或者创建 aHashSet<int>
而不是 a List<int>
,这样Contains
检查效率更高:
var activeIds = new HashSet<int>(people.Where(p => p.IsActive)
.Select(p => p.ID));
var query = otherList.Where(t => activeIds.Contains(t.ID))
.ToList();
这两者都会给查找所有匹配项提供 O(M + N) 复杂性,而不是 O(M * N) 构造一个列表然后使用它进行Contains
检查。
当然,这是假设Contains
检查将在进程中完成。如果这实际上将用于 LINQ to SQL 查询,那么可能是传入 aList<int>
很好 - 或者可能是连接允许您在数据库中完成所有操作。我们确实需要更多的上下文来给你好的建议——但不要仅仅停留在“这就是我可以构建一个List<T>
,因此我完成了”。