2009-05-17 2 views
9

Можно создать дубликат:
Yield In VB.NETМожно ли реализовать возврат доходности для функций IEnumerable в VB.NET?

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

Пример из NerdDinner кода:

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; 
} 

convert C# to VB.NET tool Это дает "YieldStatement не поддерживается" ошибка.

+0

Обратите внимание, что уступка не возвращается, по крайней мере, не в том смысле, что большинство людей означает возвращение (то, как оно выполняется под капотом, несмотря на это). Кроме того, вам не нужен перерыв в работе.Кроме того, вы можете подумать о преобразовании этого кода из получения перечисления объектов RuleViolation, чтобы получить перечисление делегатов Func . – yfeldblum

+0

Использование yield напоминает мне о трубопроводах в том, что код вызова может начинать итерирование через ienumerable * before * функция, возвращающая ienumerable, завершена. Очень круто! –

+2

Это ужасный пример, потому что вы вопиюще не нуждаетесь в том, чтобы что-то вроде этого: в чем смысл ленивого определения нарушения правил? Заполните их все в списке и сделайте с ним. Это не значит, что yeild не полезен, но это всего лишь плохой пример. – piers7

ответ

13

Там в настоящее время не соответствует доходности возвращения в VB.Net от уровня синтаксиса языка С #.

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

0

Нет Выход возвращение в VB.NET :( Просто создать список и вернуть его.

2

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

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

0

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

0

Ниже дает выход: 2, 4, 8, 16, 32

В VB,

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 

в C#

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; 
     } 
    } 
+2

Да, для этого простого примера это сработает. Существуют и другие примеры итераторов, в которых вы не хотите или не можете создать весь список в рамках одного вызова функции. Ваш код C# вычисляет каждое значение только в том случае, если вы используете их в цикле 'foreach'. Код VB вычисляет все значения при вызове функции 'setOfNumbers'. Это значительная разница. – CoderDennis

Смежные вопросы