2013-02-14 25 views
6

Tôi tự hỏi quy tắc nào có thể cho biết một phần mã LINQ có bị liệt kê kép không?Làm cách nào để biết liệu phương pháp mở rộng LINQ có bị liệt kê kép không?

Ví dụ: các dấu hiệu báo hiệu là mã sau có thể được liệt kê hai lần là gì? Một số dấu hiệu khác để tìm ra là gì?

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

Có lẽ thực tế là bạn truy cập vào 'list' và áp dụng một phương pháp LINQ to nó nhiều hơn một lần. Ngoài ra, ReSharper có một kiểm tra tốt đẹp mà cảnh báo bạn này. –

+1

Trong trường hợp này, bạn đang đề cập rõ ràng đến 'danh sách' hai lần và cả hai cách sử dụng' danh sách' của bạn sẽ buộc nó phải được liệt kê. Nhưng tôi hoàn toàn không tự tin đây là một lời giải thích tốt. – hvd

+1

Nếu bạn hỏi nếu có bất kỳ hành vi chung nào có liên quan đến "Đếm kép", tôi có thể cho bạn biết rằng không có hành vi nào. Vì IEnumerable là một giao diện, và bất kỳ hành vi nào sẽ phụ thuộc nhiều vào việc thực hiện IEnumerable. – Aron

Trả lời

7

đèo ở một trong những:

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

Tuyệt đối rực rỡ. – Contango

Các vấn đề liên quan