6

我想知道有什么规则可以判断一部分 LINQ 代码是否遭受双重枚举?

例如,以下代码可能重复枚举的迹象是什么?还有哪些需要注意的其他迹象?

public static bool MyIsIncreasingMonotonicallyBy<T, TResult>(this IEnumerable<T> list, Func<T, TResult> selector)
    where TResult : IComparable<TResult>
{
    return list.Zip(list.Skip(1), (a, b) => selector(a).CompareTo(selector(b)) <= 0).All(b     => b);
}
4

1 回答 1

7

传入其中之一:

public class OneTimeEnumerable<T> : IEnumerable<T>
{
  public OneTimeEnumerable(IEnumerable<T> source)
  {
    _source = source; 
  }

  private IEnumerable<T> _source;
  private bool _wasEnumerated = false;

  public IEnumerator<T> GetEnumerator()
  {
    if (_wasEnumerated)
    {
      throw new Exception("double enumeration occurred");
    }
    _wasEnumerated = true;
    return _source.GetEnumerator();
  }

}
于 2013-02-15T00:06:24.687 回答