2010-01-22 7 views
14

सी # 2 और वीबी.Net 8 के चालाक उपयोग iterators नामक एक नई सुविधा पेश की गईं, जिन्हें समेकन और गणनाकर्ताओं को वापस करना आसान बनाने के लिए डिज़ाइन किया गया था।नेट 2 आईटरेटर

हालांकि, यह वास्तव में coroutines का सीमित रूप है, और कई उपयोगी चीजों को करने के लिए उपयोग किया जा सकता है जिनके पास वस्तुओं के संग्रह से कुछ लेना देना नहीं है।

वास्तविक कोड में आपने इटरेटर्स के गैर-मानक उपयोगों को देखा है?

+0

क्यों सी # तक सीमित अधिक परिवर्तनों गठबंधन करने के लिए बनाता है? – ChaosPandion

+0

@Cos: मुझे एहसास नहीं हुआ कि वे भी वीबी द्वारा समर्थित थे। संपादित। – SLaks

+1

दरअसल, इटरेटर ब्लॉक ".NET" (अर्थ: रनटाइम) सुविधा नहीं हैं। वे पूरी तरह से संकलक द्वारा प्रदान की जाने वाली भाषा विशेषताएं हैं। –

उत्तर

11

मैंने उन्हें लिंक किए गए पृष्ठ इंटरैक्शन की श्रृंखला बनाने के लिए एएसपी.NET में एक सिस्टम लिखने के लिए उपयोग किया। यदि आप किसी वेबसाइट के साथ अनुरोध और प्रतिक्रियाओं की श्रृंखला के रूप में किसी उपयोगकर्ता की वार्तालाप की कल्पना करते हैं, तो आप IEnumerable के रूप में एक इंटरैक्शन मॉडल कर सकते हैं। संकल्पनात्मक रूप से, इस तरह;

IEnumerable<PageResponse> SignupProcess(FormValues form) 
{ 
    // signup starts with a welcome page, asking 
    // the user to accept the license. 
    yield return new WelcomePageResponse(); 

    // if they don't accept the terms, direct 
    // them to a 'thanks anyway' screen 
    if (!form["userAcceptsTerms"]) 
    { 
     yield return new ThanksForYourTimePageResponse(); 
     yield break; 
    } 

    // On the second page, we gather their email; 
    yield new EmailCapturePage(""); 
    while(!IsValid(form["address"])) 
    { 
    // loop until we get a valid address. 
    yield return new EmailCapturePage("The email address is incorrect. Please fix."); 
    } 
} 

आप, सत्र स्थिति में इटरेटर की दुकान इतनी है कि जब साइट के लिए उपयोगकर्ता रिटर्न तुम सिर्फ इटरेटर बाहर खींच, अगले पृष्ठ पर इटरेटर ले जाते हैं, और इसे वापस उपज प्रतिपादन के लिए कर सकते हैं। कॉम्प्लेक्स साइट इंटरैक्शन को एक ही स्थान पर कोड किया जाता है।

+0

(मैंने आपके 'उपज' वाक्यविन्यास को ठीक किया है) मुझे वास्तव में यह विचार पसंद है। यह एएसपी.NET एमवीसी के साथ भी बेहतर होगा, लेकिन इसे स्थापित करने के लिए कुछ चालबाजी हो सकती है। – SLaks

+0

धन्यवाद। मुझे संदेह है कि आप एमवीसी से मानक रूटिंग सामान निकाल सकते हैं, लेकिन मुझे लगता है कि आप सही हैं - यह बहुत काम करेगा। मेरे पास _no idea_ है कि मैं इसे async AJAX कॉल के साथ कैसे काम करूंगा ... –

+0

आप पेज अनुरोधों के बीच कहां रखेंगे?एक स्टेटलेस, क्लस्टर सर्वर पर? मुझे यकीन नहीं है कि यह सब बहुत बढ़िया है, क्षमा करें। –

8

बातें शुरू करने के लिए:

  • Jeffrey Richter AsyncEnumerator नामक एक शक्तिशाली सूत्रण प्रणाली iterators का उपयोग कर लिखा था। यह एमएसडीएन पत्रिका में वर्णित है, भागों one और two
  • आईटर थ्रेड को अवरुद्ध किए बिना एक विधि के भीतर यूआई इंटरैक्शन की प्रतीक्षा करने के लिए इटरेटर्स का भी उपयोग किया जा सकता है, जैसा कि मैंने here का वर्णन किया है।
  • इसी तरह की नस में, मैंने आईई-आधारित वेब स्क्रैपर बनाने के लिए इटरेटर्स का उपयोग किया, जिसमें स्क्रैपिंग विधियों के साथ WebAction एस के आईन्यूमेरेटर लौटाते हैं जो तैयार होने पर गणनाकर्ता में वापस कॉल करते हैं। (आमतौर पर, जब दस्तावेज़ लोड हो जाता है)।
    यदि लोग रुचि रखते हैं, तो मैं इसे यहां पोस्ट कर सकता हूं।
0

मैंने आलसी उपज ऑपरेटर के बारे में पता लगाने से पहले इस समारोह को लिखा था। यह एक बड़े पैमाने पर पुनरावर्तक बनाता है और इसे वापस करता है। यह बिल्कुल कुशल नहीं है लेकिन मुझे लगता है कि यह चालाक है।

static member generatePrimeNumbers max =  
    let rec generate number numberSequence = 
     if number * number > max then numberSequence else 
     let filteredNumbers = numberSequence |> Seq.filter (fun v -> v = number || v % number <> 0L) 
     let newNumberSequence = seq { for i in filteredNumbers -> i } 
     let newNumber = newNumberSequence |> Seq.find (fun x -> x > number) 
     generate newNumber newNumberSequence     
    generate 2L (seq { for i in 2L..max -> i }) 
+0

वह भाषा क्या है? एफ #? – SLaks

+0

हाँ, seq कीवर्ड IEnumerable के लिए एक उपनाम है। – ChaosPandion

1

मैंने इसे किसी फ़ोल्डर, इसके सबफ़ोल्डर और अन्य में निहित फ़ाइलों पर पुनरावृत्त करने के लिए उपयोग किया। प्रत्येक फाइल के लिए मुझे एक विशिष्ट कार्रवाई करना पड़ा। "उपज वापसी" बयान के साथ एक पुनरावर्ती कार्य हर किसी की समझ के लिए आसान था।

0

Rhino.ETL यह का भारी इस्तेमाल इनपुट के एक दृश्य

उदाहरण के लिए 3 आपरेशन जो जोड़ा जा सकता है के लिए

, पुन: उपयोग किया

public IEnumerable<Row> Execute(IEnumerable<Row> rows) 
{ 
    foreach(var line in File.EnumerateLines()) 
    { 
     var row = new Row(); 
     row["key"] = int.Parse(line.Substring(1)); 
     yield return row; 
    } 
} 

public IEnumerable<Row> Execute(IEnumerable<Row> rows) 
{ 
    foreach(var row in rows) 
    { 
     var value = (int)row["key"]; 
     row["key"] = value + 2; 
     yield return row; 
    } 
} 

public IEnumerable<Row> Execute(IEnumerable<Row> rows) 
{ 
    using (var file = new Streamwriter(filename)) 
    { 
     foreach(var row in rows) 
     { 
      file.WriteLine(row["key"]); 
      yield return row; 
     } 
    } 
}