我可以在VB.NET中实现IEnumerable函数的收益率返回吗?

我可以在VB.NET中实现IEnumerable函数的收益率返回吗?,vb.net,ienumerable,iterator,yield-return,Vb.net,Ienumerable,Iterator,Yield Return,可能重复: 在C#中,当编写返回IEnumerble的函数时,可以使用yield return返回枚举的单个项和yield break表示没有剩余项目。做同样的事情的VB.NET语法是什么 代码中的一个示例: public IEnumerable GetRuleViolations(){ if(String.IsNullOrEmpty(Title)) 退回新的违规行为(“需要标题”、“标题”); if(String.IsNullOrEmpty(Description)) 退回新的违规行为(“需

可能重复:

在C#中,当编写返回
IEnumerble
的函数时,可以使用
yield return
返回枚举的单个项和
yield break表示没有剩余项目。做同样的事情的VB.NET语法是什么

代码中的一个示例:

public IEnumerable GetRuleViolations(){
if(String.IsNullOrEmpty(Title))
退回新的违规行为(“需要标题”、“标题”);
if(String.IsNullOrEmpty(Description))
退回新的违规行为(“需要说明”、“说明”);
if(String.IsNullOrEmpty(HostedBy))
收益返回新规则违规(“要求托管比”、“托管比”);
if(String.IsNullOrEmpty(Address))
退回新的违规行为(“所需地址”、“地址”);
if(String.IsNullOrEmpty(国家))
收益返回新规则违反(“国家要求”、“国家”);
if(String.IsNullOrEmpty(ContactPhone))
返回新的违规行为(“电话”必填项、“联系电话”);
如果(!PhoneValidator.IsValidNumber(联系人电话,国家/地区))
返回新规则违规(“电话与国家/地区不匹配”、“联系电话”);
屈服断裂;
}

这会导致“YieldStatement不受支持”错误。

在VB.NET中没有收益回报:(
只需创建一个列表并返回它。

从语言语法层面来看,目前在VB.Net中没有与C#的yield return等价的语言

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

在这里查看我的答案:

总而言之:

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

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

下面给出了输出: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
公共共享函数setofNumbers()作为整数()
作为整数的Dim计数器=0
将结果调整为新列表(整数)
Dim结果为整数=1
而计数器<5
结果=结果*2
结果。添加(结果)
计数器+=1
结束时
返回结果。ToArray()
端函数
私有子表单1_Load(ByVal sender作为对象,ByVal e作为System.EventArgs)处理Me.Load
对于setofNumbers()中作为整数的每个i
MessageBox.Show(一)
下一个
端接头
在C中#

private void Form1\u加载(对象发送方,事件参数e)
{
foreach(整数i在setOfNumber()中)
{
Show(i.ToString());
}
}
公共静态IEnumerable setofNumbers()
{
int计数器=0;
//列表结果=新列表();
int结果=1;
while(计数器<5)
{
结果=结果*2;
计数器+=1;
收益结果;
}
}
新版本包括对VB.NET中的
产量的支持


有关使用的信息,请参阅。

注意屈服并不是回归,至少不是大多数人所说的回归(尽管它是在引擎盖下实施的)。此外,您不需要在此处使用yield break。此外,您可能需要考虑将代码从生成RuleViolation对象的枚举转换为生成Func委托的枚举。使用yield提醒我,调用代码中的管道可以在返回ienumerable的函数运行之前开始迭代ienumerable很酷!这是一个很糟糕的例子,因为你明目张胆地不需要yeild来做这样的事情:懒散地确定违反规则的行为有什么好处?把它们都列在一个列表中,然后处理掉。这并不是说yeild没有用,但这只是一个坏消息example@piers7,我学到了很多关于收益率和迭代的知识rs,因为我发布了这个问题,所以我不得不同意你的看法。这只是我第一次看到收益率,所以这就是为什么我包括这个例子。我迄今为止看到的最好的例子是一个素数生成器,它没有预设的大小限制(当然除了MaxInt)对piers7来说,我不确定这是一个如此糟糕的例子。它根据需要评估条件,并在消耗条件的任何东西停止时停止。是的,对于这个简单的例子来说,这是可行的。还有其他更好的迭代器示例,您不希望或无法在单个函数调用中创建整个列表。您的C#代码只计算每个va在
foreach
循环中使用时使用。当调用
setOfNumbers
函数时,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
   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;
        }
    }