2013-02-14 20 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 विधि लागू होते हैं। इसके अलावा, रीशेपर का एक अच्छा निरीक्षण है जो आपको इस पर अलर्ट करता है। –

+1

इस मामले में, आप स्पष्ट रूप से 'सूची' का दो बार संदर्भ दे रहे हैं, और 'सूची' के आपके दोनों उपयोगों को समाप्त करने के लिए मजबूर करना समाप्त हो गया है। लेकिन मुझे पूरा भरोसा नहीं है कि यह एक अच्छा स्पष्टीकरण है। – hvd

+1

यदि आप पूछ रहे हैं कि क्या कोई सामान्य व्यवहार है जो "डबल गणना" से जुड़ा होगा, तो मैं आपको बता सकता हूं कि कोई भी नहीं है। चूंकि IENumerable एक इंटरफ़ेस है, और कोई भी व्यवहार IENumerable के कार्यान्वयन पर अत्यधिक निर्भर होगा। – Aron

उत्तर

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