如何在VB.NET中实现迭代器模式,它没有yield关键字?
可能重复:
VB.NET中的产量
在C#中,当编写返回a的函数时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;
}
Run Code Online (Sandbox Code Playgroud)
我最近和Caliburn一起玩.一堆伟大的东西,包括合作例程的实施.
我正在做的大部分工作都是基于C#的,但现在我也正在为基于Rob的小型MVVM框架的VB.NET专卖店创建架构指南.
除了使用VB的协同程序外,一切看起来都很顺利.自从使用VB 10以来,我们可以尝试像Bill McCarthy的建议:
Public Function Lines(ByVal rdr as TextReader) As IEnumerable(Of String)
Return New GenericIterator(Of String)
(Function(ByRef nextItem As String) As Boolean
nextItem = rdr.ReadLine
Return nextItem IsNot Nothing
End Function)
End Function
Run Code Online (Sandbox Code Playgroud)
我只是无法理解如何在VB中编写一个更复杂的常规方法(如Rob的GameLibrary中的方法):
public IEnumerable<IResult> ExecuteSearch()
{
var search = new SearchGames
{
SearchText = SearchText
}.AsResult();
yield return Show.Busy();
yield return search;
var resultCount = search.Response.Count();
if (resultCount == 0)
SearchResults = _noResults.WithTitle(SearchText); …Run Code Online (Sandbox Code Playgroud) 使用下面的C#代码,您将如何在Visual Basic中编写它?它试图说什么?
using System;
using System.Collections.Generic;
using System.IO;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;
namespace Microsoft.LiveLabs.Pivot
{
/// <summary>
/// Tile Builder class
/// </summary>
public static class TileBuilder
{
/// <summary>
/// Specifies which images are required in the images array used in CreateTile
/// according to the Morton fractal pattern used by Seadragon.
/// </summary>
/// <remarks>
/// Usage of this and CreateTile are kind of tricky. Here's an example:
/// Say you have a results …Run Code Online (Sandbox Code Playgroud) VB.Net对c#是否具有等价性yield break?
Public Function Validate(validationContext As ValidationContext)
As IEnumerable(Of ValidationResult)
Implements IValidatableObject.Validate
'' what is equivalent to C#'s - yield break;
End Function
Run Code Online (Sandbox Code Playgroud) 伙计们,我正在尝试将某些东西从C#转换为VB.NET,而我在查找VB.NET与C#的yield关键字方面存在差异.我意识到'yield'不是VB.NET的可转换关键字,所以有人可以告诉我如何在VB.NET中实现这个代码.除了实现的GetEnumerator()函数之外,我将其全部转换过来.它只是一个实现CollectionBase和IEnumerable的类(使LINQ值得):
[Serializable()]
public partial class Customers : CollectionBase, System.Collections.Generic.IEnumerable<BusinessLayer.Customer>
{
public new System.Collections.Generic.IEnumerator<BusinessLayer.Customer> GetEnumerator()
{
foreach (BusinessLayer.Customer Cust in this.List)
{
yield return Cust;
}
}
public Customers()
{
}
public Customers(DataRowCollection datarows) : this()
{
this.Load(datarows);
}
protected void Load(DataRowCollection dataRows)
{
foreach (DataRow dr in dataRows) {
this.Add(new Customer(dr));
}
}
public Customer this[int index] {
get { return (Customer)base.InnerList[index]; }
set { base.InnerList[index] = value; }
}
public int Add(Customer val)
{
return base.InnerList.Add(val);
}
}
Run Code Online (Sandbox Code Playgroud)
在此先感谢您的帮助!
vb.net ×7
c# ×5
yield ×3
ienumerable ×2
iterator ×2
.net ×1
caliburn ×1
comparison ×1
coroutine ×1
linq ×1
loops ×1
yield-return ×1