最终结果是我想使用.Where(t => someIntList.Contains(t.ID)).ToList()
。我正在努力创建someIntList
。
到目前为止:List<Person> people = people.Where(p => p.isActive).ToList()
。如何仅返回List<int>
属性p.ID
?
还是有另一种方法可以做包含(没有写一个Comparer类,因为我已经有一个用于其他目的。
答案 0 :(得分:7)
好吧,使用Select
执行投影很容易产生List<int>
:
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)复杂度,而不是O(M * N)构造一个列表然后使用那个来Contains
检查会做。
当然,假设Contains
检查将在进程中完成。如果实际将在LINQ to SQL查询中使用,那么可能传入List<int>
就好了 - 或者可能是连接允许您在数据库中完成所有操作。我们真的需要更多的上下文来给你很好的建议 - 但不只是停下来“这就是我可以建立一个List<T>
,因此我已经完成了。”