最终结果是我想用.Where(t => someIntList.Contains(t.ID)).ToList()
.我正在努力创建 someIntList
.
我目前拥有的:List<Person> people = people.Where(p => p.isActive).ToList()
.如何只返回 List<int>
的 p.ID
属性(property)?
或者是否有另一种方法来执行 Contains(无需编写 Comparer 类,因为我已经将其用于其他目的。
最佳答案
好吧,生成 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;
或者创建一个 HashSet<int>
而不是 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) 的复杂度,而不是构建列表然后使用 that 作为 Contains
的 O(M * N)检查就可以了。
当然,这是假设 Contains
检查将在过程中完成。如果这实际上将在 LINQ to SQL 查询中使用,那么它可能是传入一个 List<int>
很好 - 或者 可能 连接允许您在数据库中完成所有操作。我们确实需要更多上下文来为您提供好的建议 - 但不要仅仅停留在“这就是我构建 List<T>
的方式,因此我完成了。”
关于c# - 从具有整数属性的 List<T> 返回 List<int>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12717954/