0

给出一个这样的例子:

x = SomeFunctionReturningIEnumerable().ToArray();


if (!x.Any())
{
    //... (some code here that doesn't enumerate x)
    //...
    foreach (var item in x)
    {
        //...
    }
}

在什么情况下ToArray()打电话是个好主意,在什么情况下是坏主意?在什么情况下它根本不重要。

4

1 回答 1

0

如果枚举特别昂贵并且您不想缓冲整个序列,我会使用Ix-MainMemoize(). 这将缓冲两次迭代:

x = SomeFunctionReturningIEnumerable().Memoize(2);

if (!x.Any())
{
    //... (some code here that doesn't enumerate x)
    //...
    foreach (var item in x)
    {
        //...
    }
}

Any() 立即销毁其 Enumerator,因此只有第一个值会被缓冲——一旦foreach通过它,它将再次从源流。

于 2013-10-24T03:51:39.323 回答