迭代模式VB.NET (C#将使用的产量!) [重复]
-
05-07-2019 - |
解决方案
这是现在,支持在VS2010SP1,用异步CTP,见: 迭代(C#和视觉基本的)关MSDN 和 下载Visual Studio异步CTP(第3版).
代码如此,工作:
Private Iterator Function SomeNumbers() As IEnumerable
' Use multiple yield statements.
Yield 3
Yield 5
Yield 8
End Function
其他提示
VB.NET 不支持创建的定义迭代,因此没有相当于C#产率的关键词。但是,你可能想看看KB的文章 如何做一个视觉基础。网或视觉基本的2005年级可用于每次发言 更多的信息。
C#'s产率的关键字的部队编译器,以创建一个国家机的背景下予以支持。VB.Net 没有产率的关键词。但它确实有一个构造,将允许您可以创建一个国家机器内一个功能: 静态功能的成员.
应该可以模仿的影响的产量返回的功能,通过创建一个通用的级,实施类型以及所需的国家机和放置的一个实例作为一个静态部件内部的功能。
这当然将需要实施类以外的功能。但如果做得适当类应以可重复使用在一般的情况。我还没玩过这个想法不足以提供任何实施细节,虽然。
嗯,看来你可能是 运气不好:
我是挣扎着一个问题今天变换时,一些C#VB.NET.C#有一个很酷的"收益率"的声明中使用的迭代方框中提供有价值的枚举的对象。VB.NET 没有"收益"的关键词。所以,有几个方案(它们都不是真的清洁)来解决这个问题。你可以利用返回的声明返回的价值,如果你是循环,并想要打破枚举和返回的一个单一的价值。但是,如果你想要返回的整个枚举,创建一个清单()儿童的类型和返回的名单。因为你是通常使用这一类型,List()将工作很好。
那是写在一年前,不能确定,如果任何人有拿出任何其他更好的自然后..
编辑:这将有可能在11版的VB.NET (一之后VS2010),支持迭代计划。规格 可以在这里.
请记住,延迟执行和懒惰性评估的皇宫expresssions和方法使我们能够有效地实行定制的迭代,直到产量的发言提供。净额4.5.产量在内部使用的皇宫表现形式和方法。
以下代码表明了这一点。
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
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;
}
}