نمط التكرار في VB.NET (سيستخدم C # العائد!) [نسخة مكررة]

StackOverflow https://stackoverflow.com/questions/250874

سؤال

هذا السؤال لديه بالفعل إجابة هنا:

كيفية تنفيذ نمط التكرار في VB.NET, ، الذي لا يملك yield الكلمة الرئيسية؟

هل كانت مفيدة؟

المحلول

وهذا مدعوم الآن في VS 2010 SP1، مع Async CTP، راجع: التكرارات (C# وVisual Basic) على MSDN و تنزيل Visual Studio Async CTP (الإصدار 3).

كود مثل هذا يعمل:

Private Iterator Function SomeNumbers() As IEnumerable
    ' Use multiple yield statements.
    Yield 3
    Yield 5
    Yield 8
End Function

نصائح أخرى

لا يدعم VB.NET إنشاء مكررات مخصصة وبالتالي لا يوجد لديه ما يعادل الكلمة الأساسية C#.ومع ذلك، قد ترغب في إلقاء نظرة على مقالة قاعدة المعارف كيفية جعل فئة Visual Basic .NET أو Visual Basic 2005 قابلة للاستخدام في عبارة For Each للمزيد من المعلومات.

تجبر الكلمة الأساسية الخاصة بـ C# المترجم على إنشاء جهاز حالة في الخلفية لدعمه.لا يحتوي VB.Net على الكلمة الأساسية "العائد".لكنها تحتوي على بنية تسمح لك بإنشاء آلة حالة داخل دالة: أعضاء الوظيفة الثابتة.

يجب أن يكون من الممكن محاكاة تأثيرات دالة إرجاع العائد عن طريق إنشاء فئة عامة تنفذ IEnumerable بالإضافة إلى آلة الحالة المطلوبة ووضع مثيل كعضو ثابت داخل وظيفتك.

سيتطلب هذا بالطبع تنفيذ الفصل خارج الوظيفة.ولكن إذا تم ذلك بشكل صحيح، فيجب إعادة استخدام الفصل في الحالة العامة.لم ألعب بالفكرة بما يكفي لتقديم أي تفاصيل للتنفيذ.

حسنًا، يبدو أنك قد تكون كذلك نفد منى الحظ:

كنت أعاني من مشكلة اليوم عند تحويل بعض لغة C# إلى VB.NET.يحتوي C# على عبارة "إرجاع العائد" الرائعة التي يتم استخدامها في كتلة التكرار لتوفير قيمة لكائن العداد.لا يحتوي VB.NET على الكلمة الأساسية "العائد".لذا، هناك بعض الحلول (ليس أيًا منها نظيفًا حقًا) للتغلب على هذه المشكلة.يمكنك استخدام عبارة return لإرجاع القيمة إذا كنت تقوم بالتكرار وترغب في فصل العداد وإرجاع قيمة واحدة.ومع ذلك، إذا كنت ترغب في إرجاع التعداد بأكمله، فقم بإنشاء List() من النوع الفرعي وأعد القائمة.نظرًا لأنك تستخدم هذا عادةً مع IEnumerable، فستعمل List() بشكل جيد.

تمت كتابته قبل عام، ولست متأكدًا مما إذا كان أي شخص قد توصل إلى أي شيء أفضل منذ ذلك الحين..


يحرر:سيكون هذا ممكنًا في الإصدار 11 من VB.NET (الإصدار الذي يأتي بعد VS2010)، ومن المخطط دعم التكرارات.المواصفات متاح هنا.

ضع في اعتبارك أن التنفيذ المؤجل وخصائص التقييم البطيئة لتعبيرات وأساليب LINQ تسمح لنا بتنفيذ التكرارات المخصصة بشكل فعال حتى يتوفر بيان العائد في .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

أدناه يعطي الإخراج:2، 4، 8، 16، 32

في VB.NET

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;
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top