首页 > 解决方案 > .Where(x=> x.listFoos.Count() > 1) 是否计算所有子元素?

问题描述

给定一个具有 List 类型属性的对象列表:

class Bar{
   public List<Foo> Foos{get;set;}
}

以下代码会选择所有包含多个 Foo 的条形图吗?
或者它会在 2 Foos 处停止迭代吗?

var input = new List<Bar>();
var result = input.Where(x=> x.Foos.Count()>1).ToList();

标签: c#linq

解决方案


它不会计算任何东西。List<T>冗余存储元素的数量,因此访问Count属性是一个O(1)操作

即使您使用Enumerable.Count()扩展方法而不是List<T>s 内置Count属性,这也有效,因为如果底层数据源实现Enumerable.Count() 了内置优化ICollection<T>


正如评论中的 Enigmativity 所提到的:如果您有一个不是IEnumerable的IEnumerable ,则ICollection<T>可以使用以下命令来防止迭代整个可枚举:

var result = input.Where(x => x.Foos.Skip(1).Any()).ToList();

推荐阅读