VB.NET में इटरेटर पैटर्न को कैसे कार्यान्वित करें, जिसमें yield
कीवर्ड नहीं है?वीबीएनईटी में आईटरेटर पैटर्न (सी # उपज का उपयोग करेगा!)
उत्तर
अब यह असिन सीटीपी के साथ वीएस 2010 एसपी 1 में समर्थित है, देखें: Iterators (C# and Visual Basic) on MSDN और download Visual Studio Async CTP (Version 3)।
कोड इस जैसे, काम करता है:
Private Iterator Function SomeNumbers() As IEnumerable
' Use multiple yield statements.
Yield 3
Yield 5
Yield 8
End Function
हम्म, लगता है कि आप out of luck हो सकता है:
मैं आज एक मुद्दा के साथ संघर्ष कर रहा था जब VB.NET के लिए कुछ सी # परिवर्तित। सी # में वास्तव में एक अच्छा "उपज रिटर्न" कथन है जिसका उपयोग एमेरेटर ब्लॉक में किया जाता है ताकि गणनाकर्ता वस्तु को मूल्य प्रदान किया जा सके। वीबी.नेट में "उपज" कीवर्ड नहीं है। तो, इस के आसपास पाने के लिए कुछ समाधान हैं (जिनमें से कोई भी वास्तव में साफ नहीं है)। यदि आप लूपिंग कर रहे हैं और एक गणनाकर्ता को तोड़ना चाहते हैं और एक मान वापस करना चाहते हैं तो आप मूल्य वापस करने के लिए रिटर्न स्टेटमेंट का उपयोग कर सकते हैं। हालांकि, अगर आप पूरी गणना वापस करना चाहते हैं, तो बच्चे के प्रकार की एक सूची() बनाएं और सूची वापस करें। चूंकि आप आमतौर पर इसे एक आईनेमरेबल के साथ उपयोग कर रहे हैं, इसलिए सूची() अच्छी तरह से काम करेगी।
एक साल पहले लिखा गया था कि, यकीन नहीं करता है, तो किसी को भी कुछ और तब से बेहतर साथ आ गया है ..
संपादित करें: इस VB.NET के 11 संस्करण में संभव हो जाएगा (वीएस -2010 के बाद एक), इटरेटर के लिए समर्थन की योजना बनाई गई है। Spec is available here।
वीबीएनईटी कस्टम इटरेटर्स के निर्माण का समर्थन नहीं करता है और इस प्रकार सी # उपज कीवर्ड के बराबर नहीं है। हालांकि, आप अधिक जानकारी के लिए केबी आलेख How to make a Visual Basic .NET or Visual Basic 2005 class usable in a For Each statement पर देखना चाहेंगे।
सी # की उपज कीवर्ड संकलक को पृष्ठभूमि में राज्य मशीन बनाने के लिए मजबूर करता है ताकि इसका समर्थन किया जा सके। वीबी.Net में उपज कीवर्ड नहीं है। लेकिन इसमें एक ऐसा निर्माण है जो आपको फ़ंक्शन के भीतर एक राज्य मशीन बनाने की अनुमति देगा: Static function members।
एक जेनेरिक क्लास बनाकर उपज रिटर्न फ़ंक्शन के प्रभावों की नकल करना संभव होना चाहिए जो आईन्यूमेरेबल के साथ-साथ आवश्यक राज्य मशीन लागू करता है और आपके फ़ंक्शन के अंदर एक स्थिर सदस्य के रूप में एक उदाहरण रखता है।
यह निश्चित रूप से, कार्य के बाहर कक्षा को कार्यान्वित करने की आवश्यकता होगी। लेकिन अगर सही तरीके से किया जाता है तो कक्षा सामान्य मामले में फिर से प्रयोग योग्य होनी चाहिए। हालांकि, मैंने कोई कार्यान्वयन विवरण प्रदान करने के लिए पर्याप्त विचार के साथ नहीं खेला है।
मुझे अभी भी इस अवधारणा के आसपास अपना सिर मिल रहा है। आलेख Use Iterators in VB Now हाल ही में विजुअल स्टूडियो पत्रिका में प्रकाशित किया गया था।
लिंक टूटा हुआ है! – Peter
नीचे उत्पादन देता है: 2, 4, 8, 16, 32
वीबी में।नेट
Public Shared Function setofNumbers() As Integer()
Dim counter As Integer = 0
Dim results As New List(Of Integer)
Dim result As Integer = 1
While counter < 5
result = result * 2
results.Add(result)
counter += 1
End While
Return results.ToArray()
End Function
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
For Each i As Integer In setofNumbers()
MessageBox.Show(i)
Next
End Sub
सी # में
private void Form1_Load(object sender, EventArgs e)
{
foreach (int i in setofNumbers())
{
MessageBox.Show(i.ToString());
}
}
public static IEnumerable<int> setofNumbers()
{
int counter=0;
//List<int> results = new List<int>();
int result=1;
while (counter < 5)
{
result = result * 2;
counter += 1;
yield return result;
}
}
ध्यान रखें कि LINQ expresssions की आस्थगित निष्पादन और आलसी मूल्यांकन गुण और विधियों हमें प्रभावी रूप से कस्टम iterators को लागू करने के लिए जब तक उपज बयान .NET 4.5 में उपलब्ध है अनुमति देते हैं। यील्ड का उपयोग LINQ अभिव्यक्तियों और विधियों द्वारा आंतरिक रूप से किया जाता है।
निम्नलिखित कोड यह दर्शाता है।
Private Sub AddOrRemoveUsersFromRoles(procName As String,
applicationId As Integer,
userNames As String(),
rolenames As String())
Dim sqldb As SqlDatabase = CType(db, SqlDatabase)
Dim command As DbCommand = sqldb.GetStoredProcCommand(procName)
Dim record As New SqlDataRecord({New SqlMetaData("value", SqlDbType.VarChar,200)})
Dim setRecord As Func(Of String, SqlDataRecord) =
Function(value As String)
record.SetString(0, value)
Return record
End Function
Dim userNameRecords As IEnumerable(Of SqlDataRecord) = userNames.Select(setRecord)
Dim roleNameRecords As IEnumerable(Of SqlDataRecord) = rolenames.Select(setRecord)
With sqldb
.AddInParameter(command, "userNames", SqlDbType.Structured, userNameRecords)
.AddInParameter(command, "roleNames", SqlDbType.Structured, roleNameRecords)
.AddInParameter(command, "applicationId", DbType.Int32, applicationId)
.AddInParameter(command, "currentUserName", DbType.String, GetUpdatingUserName)
.ExecuteNonQuery(command)
End With
End Sub
- 1. नेट 2 आईटरेटर
- 2. सी #/वीबीएनईटी
- 3. सी #/वीबीएनईटी
- 4. उपज रिटर्न का अधिभारित उपयोग
- 5. पायथन में उपज और सी #
- 6. वीबीएनईटी सी # "के रूप में"
- 7. वीबीएनईटी
- 8. सी # और वीबीएनईटी
- 9. सी # में बूलियन मान पर | = ऑपरेटर का उपयोग क्यों करेगा?
- 10. वीबीएनईटी से सी #
- 11. Winforms में एमवीसी एमवीपी पैटर्न का उपयोग
- 12. वीबीएनईटी
- 13. .NET (सी #/वीबीएनईटी) में जेनरिक के उपयोग के उदाहरण
- 14. std :: this_thread :: उपज() उपयोग?
- 15. वीबीएनईटी
- 16. वीबीएनईटी
- 17. वीबीएनईटी
- 18. वीबीएनईटी
- 19. स्थिर/वीबीएनईटी और सी # दृश्यता में साझा
- 20. क्या मैं वीबीएनईटी में आईन्यूमेरेबल कार्यों के लिए उपज रिटर्न लागू कर सकता हूं?
- 21. सी # आंतरिक वीएस वीबीएनईटी मित्र
- 22. सी # थ्रेड-सुरक्षित में उपज वापसी है?
- 23. वीबीएनईटी
- 24. वीबीएनईटी
- 25. वीबीएनईटी
- 26. वीबीएनईटी
- 27. वीबीएनईटी
- 28. वीबीएनईटी
- 29. उपज क्या है ?, और एएसपीनेट में उपज का उपयोग करने के लिए लाभ क्या है?
- 30. वीबीएनईटी
हे जोएल, आपने कम से कम दो बार इस विचार का उल्लेख किया है। फैंसी आपके विचार को आगे बढ़ा रहा है? –
मैंने इसे थोड़ा गहराई से देखा है, और मुझे अब यकीन नहीं है कि आप एक ही प्रकार की स्टेट मशीन बना सकते हैं जैसे सी # के उपज कीवर्ड VB.Net स्टेटिक स्थानीय चर में। ऐसा नहीं है कि यह असंभव होगा, लेकिन यह निश्चित रूप से तुच्छ नहीं होगा और अंत में आपको मशीन को असाइन करने के लिए कुछ अजीब कोड लिखना होगा। यहां तक कि आप दृश्य स्टूडियो 2005 में भी नहीं कर सके, क्योंकि इसे लैम्ब्डा अभिव्यक्तियों की आवश्यकता होगी। –