使用整数属性从List <T>返回List <int>?

Mar*_*cus 2 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类,因为我已经有一个用于其他目的.

Jon*_*eet 7

好吧,生成它List<int>很容易,Select用于执行投影:

List<int> activeIds = people.Where(p => p.IsActive)
                            .Select(p => p.ID)
                            .ToList();
Run Code Online (Sandbox Code Playgroud)

但是,Contains我会执行连接,而不是那样做然后使用,

var activePeople = people.Where(p => p.IsActive);
var query = from person in otherList
            join activePeople on person.ID equals activePeople.ID
            select person;
Run Code Online (Sandbox Code Playgroud)

或者创建一个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();
Run Code Online (Sandbox Code Playgroud)

这两个都会给找到所有匹配的O(M + N)复杂度,而不是O(M*N)构造一个列表然后用来进行Contains检查.

当然,这是假设Contains检查将在进行中完成.如果这实际上将用于LINQ to SQL查询,则可能是传入a List<int>很好 - 或者可能是连接允许您在数据库中完成所有操作.我们真的需要更多的背景来给你很好的建议 - 但不要只是停下来"这就是我可以建立一个List<T>,所以我已经完成了."

  • @RiskyMartin:是的,它会减少重复 - 但这也意味着你必须过滤掉空组.说实话,如果这些真的是ID,我会*期望*没有任何重复...但我们不能没有尝试它真的说. (2认同)