2

最终结果是我想使用.Where(t => someIntList.Contains(t.ID)).ToList(). 我正在努力创造someIntList.

到目前为止我所拥有的:List<Person> people = people.Where(p => p.isActive).ToList()。我如何只归还List<int>房产的p.ID一部分?

或者有另一种方法来做包含(不写一个比较器类,因为我已经有一个用于另一个目的。

4

1 回答 1

7

好吧,制作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>,因此我完成了”。

于 2012-10-03T22:49:07.797 回答