从List <t>返回一个带有整数属性的List <int>?</t> </int>

时间:2012-10-03 22:46:33

标签: c# linq c#-4.0

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

到目前为止:List<Person> people = people.Where(p => p.isActive).ToList()。如何仅返回List<int>属性p.ID

还是有另一种方法可以做包含(没有写一个Comparer类,因为我已经有一个用于其他目的。

1 个答案:

答案 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>,因此我已经完成了。”