公共方法的收益率反模式?

Dir*_*oer 0 c# performance yield yield-return

yield return是一种非常好的语法,可以快速编写过滤器或映射,这些过滤器或映射对于使用Linq语句来说太过分了.这就是为什么我经常写这样的方法:

public IEnumerable<Person> GetFilteredPersons()
{
    foreach ( var person in _Persons )
    {
        // [Semi-expensive logic]
        yield return person;
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是这个方法的用户不知道当他多次迭代时他obj.GetFilteredPersons()浪费了不必要的CPU.它甚至可能意味着当他认为他正在进行两次简单的O(n)迭代时,他实际上是两次O(n^2)迭代.

这个类是否有责任只公开O(n)枚举器,我希望在返回'yielding'之前总是调用ToList()IEnumerableToList()当用户只想迭代一次时,调用一个unnessary的(小)缺点?

或者我应该将这个决定留给这个类的用户,让他们ToList在迭代之前决定他们是否想要结果?

假设我们正在讨论高性能环境.

Mar*_*zek 12

用户负责调用ToList()从声明为返回的方法返回的值,IEnumerable<T>如果它知道它将需要多次枚举返回的集合并且不想重新计算这些值.

在这些情况下,ReSharper甚至会发出警告.

此外,将决策推向调用者可以提供更大的灵活性,因为在某些情况下,您不受CPU限制,但是您对内存使用的限制,并且您可以进行额外的计算以防止发生额外的分配.