2009-05-21 15 views
7

मैंने इस सुविधा का उपयोग करने के तरीके पर दस्तावेज़ीकरण के लिए उच्च और निम्न खोज की है। जबकि लूप I लिखना आसान होगा और कोई समय नहीं लगेगा, मैं वास्तव में यह जानना चाहता हूं कि इसका उपयोग कैसे करें।सूची में दृश्य मूलभूत (टी) में एक्शन (टी)। प्रत्येक

असल में मेरे पास एक कक्षा है, Widget, Save() सब के साथ कुछ भी नहीं देता है। तो:

Dim w as New Widget() 
w.Save() 

मूल रूप से विजेट बचाता है। अब मान लें कि मेरे पास एक सामान्य संग्रह List(Of Widget) नाम widgetList(Of Widget) है और मैं उस सूची में प्रत्येक आइटम पर Save() चलाने के लिए चाहता हूं। इसे कहते हैं मैं एक

widgetList.ForEach([enter Action(Of T) here]) 

.... लेकिन यह काम कैसे एफ में करता है क्या कर सकते हैं ??? Intrablags पर कहीं भी कोई दस्तावेज नहीं है। मदद की बहुत सराहना की जाएगी।

+0

ps मैंने लैम्ब्डा कार्यों पर कुछ शोध किया और उन तकनीकों में से कुछ कोशिश की, लेकिन मैं उनमें से कोई भी काम करने के लिए नहीं मिला ... ugh ... – Jason

+0

यदि आप विजुअल स्टूडियो 2005 का उपयोग कर रहे हैं तो आपके पास पहुंच नहीं होगी वीबी –

उत्तर

11

आप VB9 (VS2008) मैं नहीं लगता कि उपयोग कर रहे हैं आप एक गुमनाम समारोह आसानी से उपयोग करने के लिए सक्षम हो जाएगा - VB9 में जहाँ तक मुझे पता है, अनाम प्रक्रियाएं हूँ के रूप में है वास्तविक कार्य होने के लिए (यानी उन्हें एक मूल्य वापस करना होगा) जबकि Action<T> कुछ भी वापस नहीं करता है। सी #, 2 की एक अनाम तरीकों और सी # 3 के लैम्ब्डा भाव अधिक सामान्य होते हैं, जिसके कारण आप वीबी :(का उपयोग कर सी # और बहुत कुछ से के उपयोग के उदाहरण का भार देखेंगे

आप संभवतः एक MakeAction आवरण जो एक लेता है लिख सकता है ।। Function<T,TResult> और एक Action<T> देता है, लेकिन मैं VB9 अनाम प्रक्रियाएं पर अन्य प्रतिबंध संदेह है कि यह अव्यावहारिक होगा

अच्छी खबर यह है कि VB10 has much more anonymous function support है (सी # 4 और VB10 एक दूसरे की सुविधाओं प्राप्त कर रहे हैं - मेरा मानना ​​है कि एमएस जाना कोशिश कर रहा है अब से भाषा की समानता के लिए, पहले की तुलना में काफी हद तक।)

तब तक, का उपयोग करने के लिए आपको एक उचित Sub लिखना होगा और इसके प्रतिनिधि को बनाने के लिए AddressOf का उपयोग करना होगा। यहां एक छोटा उदाहरण है:

Imports System 
Imports System.Collections.Generic 

Public Class Test 

    Shared Sub Main() 
     Dim names as New List(Of String) 
     names.Add("Jon") 
     names.Add("Holly") 
     names.ForEach(AddressOf PrintMe) 

    End Sub 

    Shared Sub PrintMe(ByVal text as String) 
     Console.WriteLine(text) 
    End Sub 

End Class 
+0

धन्यवाद, और उदाहरण के लिए धन्यवाद! मेरी इच्छा है कि कक्षा कार्यों की मेरी पहले से बढ़ती हुई सूची को अपनाने से बेहतर तरीका हो, लेकिन यह अभी काम करता है! – Jason

+0

यह वास्तव में व्यावहारिक नहीं है .. है ना? –

-1

नीचे काम करना चाहिए हालांकि मैं VB.Net पर तेज़ी से नहीं बढ़ रहा हूं, इसलिए आपको तदनुसार समायोजित करने की आवश्यकता हो सकती है।

widgetList.ForEach(w => w.Save()) 
+1

में लम्दा अभिव्यक्तियों के लिए यह समस्या है ... सी # और वीबी इस पर बहुत भिन्न हैं, इसलिए मुझे वीबी सिंटैक्स की आवश्यकता है ..... – Jason

0

यह मानते हुए कि वीबी लैम्ब्डा अभिव्यक्ति का समर्थन नहीं करता, तो आप कार्रवाई (टी की) का एक उदाहरण प्रतिनिधि VB में इस सिंटैक्स का उपयोग बना सकते हैं: अच्छी तरह से

new Action(Of T)(AddressOf Widget.Save) 
12

, मैं 'अब वास्तव में पुरानी हो चुकी हूँ ... :-) लेकिन VB में यह बताया गया है:

widgetList.ForEach(Sub(w) w.Save()) 

या, और अधिक जटिल:

widgetList.ForEach(New Action(Of Widged)(Sub(w As Widged) w.Save())) 
0 यदि विजेट एक सार्वजनिक समारोह Save बुलाया मिला
+0

क्या यह उत्तर नहीं होना चाहिए? – Lopsided

1
new Action(Of T)(AddressOf Widget.Save) 

ठीक है।

जब मैं कोशिश करता हूं तो अन्य सभी टिप्पणी झूठी होती हैं।

संबंधित मुद्दे