Могу ли я реализовать возврат доходности для функций IEnumerable в VB.NET?[дубликат]

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

Вопрос

Возможный дубликат:
Доходность в VB.NET

В C# при написании функции, возвращающей IEnumerble<>, вы можете использовать yield return вернуть один элемент перечисления и yield break; чтобы обозначить отсутствие оставшихся предметов.Каков синтаксис VB.NET для выполнения того же самого?

Пример из БотаникУжин код:

public IEnumerable<RuleViolation> GetRuleViolations() {

   if (String.IsNullOrEmpty(Title))
       yield return new RuleViolation("Title required","Title");

   if (String.IsNullOrEmpty(Description))
       yield return new RuleViolation("Description required","Description");

   if (String.IsNullOrEmpty(HostedBy))
       yield return new RuleViolation("HostedBy required", "HostedBy");

   if (String.IsNullOrEmpty(Address))
       yield return new RuleViolation("Address required", "Address");

   if (String.IsNullOrEmpty(Country))
       yield return new RuleViolation("Country required", "Country");

   if (String.IsNullOrEmpty(ContactPhone))
       yield return new RuleViolation("Phone# required", "ContactPhone");

   if (!PhoneValidator.IsValidNumber(ContactPhone, Country))
       yield return new RuleViolation("Phone# does not match country", "ContactPhone");

   yield break;
}

Этот конвертировать C# в инструмент VB.NET выдает ошибку «YieldStatement не поддерживается».

Это было полезно?

Решение

В настоящее время в VB.Net нет эквивалента возврата доходности C# на уровне синтаксиса языка.

Однако недавно в журнале MSDN Билл Маккарти написал статью о том, как реализовать аналогичный шаблон в VB.Net 9.0.

Другие советы

Новый Асинхронный CTP включает поддержку Yield в ВБ.НЕТ.

Видеть Итераторы в Visual Basic для получения информации об использовании.

Смотрите мои ответы здесь:

Обобщить:
В VB.Net нет доходности, но C# реализует доходность путем преобразования вашего кода в конечный автомат за кулисами.ВБ.Нет Static Ключевое слово также позволяет вам сохранять состояние внутри функции, поэтому теоретически вы сможете реализовать класс, который позволит вам писать аналогичный код при использовании в качестве Static член метода.

Нет возврата доходности в vb.net :( просто создайте список и верните его.

За кулисами компилятор создает класс перечислителя для выполнения этой работы.Поскольку VB.NET не реализует этот шаблон, вам необходимо создать собственную реализацию IEnumerator(Of T).

Ниже приведены результаты: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;
        }
    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top