我可以在VB.NET中实现IEnumerable函数的yield return吗?

时间:2009-05-17 21:55:56

标签: vb.net ienumerable iterator yield-return

  

可能重复:
  Yield In 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”错误。

6 个答案:

答案 0 :(得分:13)

目前,从语言语法级别来看,VB.Net中没有等效的C#收益率。

然而,Bill McCarthy最近在MSDN杂志上发表了关于如何在VB.Net 9.0中实现类似模式的文章

答案 1 :(得分:8)

新的Async CTP包括对VB.NET中Yield的支持。

有关使用情况的信息,请参阅Iterators in Visual Basic

答案 2 :(得分:2)

在这里查看我的答案:

总结:
VB.Net没有收益,但C#通过将代码转换为场景后面的状态机来实现收益。 VB.Net的Static关键字还允许您在函数中存储状态,因此理论上您应该能够实现一个类,当您用作方法的Static成员时,该类允许您编写类似的代码

答案 3 :(得分:0)

VB.NET中没有收益率返回:( 只需创建一个列表并将其返回。

答案 4 :(得分:0)

在幕后,编译器会创建一个枚举器类来完成工作。由于VB.NET没有实现这种模式,你必须创建自己的IEnumerator(Of T)实现

答案 5 :(得分: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;
        }
    }