在包含在IEnumerable元素内的列表上调用.Count

时间:2015-04-01 09:04:33

标签: c# performance list count ienumerable

在我的代码中,我有一个IEnumerable:

IEnumerable<SomeType> listOfSomething = MethodWhichReturnsAnIEnumerable(param 1)

现在,listOfSomething中的每个元素都包含其他内容的列表,我们称之为listOfRules。我需要返回listOfSomethinglistOfRules中包含&gt; 0元素的元素:

var result = listOfSomething.Where(x => x.listOfRules.Count > 0);

这对表现意味着什么? listOfRulesList所以我很好奇调用Count会对IEnumerable listOfSomething做些什么,因为它是否会将所有内容都放入内存。

3 个答案:

答案 0 :(得分:2)

由于listOfRulesList,查询Count属性的速度非常快,因为对于List,它只返回私有字段的值,而不是每次都迭代整个集合。这是一个实现,取自here

// Read-only property describing how many elements are in the List.
public int Count {
    get {
        Contract.Ensures(Contract.Result<int>() >= 0);
        return _size; 
    }
}

答案 1 :(得分:1)

如果listOfRules是使用List<T>的{​​{1}},则只返回它不会枚举该集合的存储值。它与Count无关,listOfSomething将被枚举,并且每个列表都会调用listOfSomething属性。所以没有什么可担心的。

答案 2 :(得分:0)

list.Count只返回字段的值,所以非常快。 O(1) 因此,您的整体表现将为O(N),其中N是listOfSomething中的记录数。