2013-02-14 81 views
6

我想知道是否有什麼規則要告訴如果一部分LINQ代碼遭受雙重枚舉?如何判斷一個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); 
} 
+2

可能是你訪問'list'和應用LINQ方法將其不止一次的事實。此外,ReSharper有一個很好的檢查,提醒你這一點。 – 2013-02-14 23:31:56

+1

在這種情況下,您明確提到'list'兩次,並且'list'的兩個用法都會強制它被枚舉。但我完全不相信這是一個很好的解釋。 – hvd 2013-02-14 23:32:14

+1

如果你問是否有任何與「雙枚舉」相關的一般行爲,我可以告訴你沒有。由於IEnumerable是一個接口,任何行爲都將高度依賴於IEnumerable的實現。 – Aron 2013-02-15 02:56:23

回答

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(); 
    } 

} 
+0

絕對的輝煌。 – Contango 2013-02-15 11:12:02