我可以在 VB.NET 中為 IEnumerable 函數實現收益返回嗎? (Can I implement yield return for IEnumerable functions in VB.NET?)


問題描述

我可以在 VB.NET 中為 IEnumerable 函數實現收益返回嗎? (Can I implement yield return for IEnumerable functions in VB.NET?)

  

Possible Duplicate:   Yield In VB.NET  

In C#, when writing a function that returns an IEnumerble<>, you can use yield return to return a single item of the enumeration and yield break; to signify no remaining items.  What is the VB.NET syntax for doing the same thing?

An example from the NerdDinner code:

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

This convert C# to VB.NET tool gives a "YieldStatement is unsupported" error.

‑‑‑‑‑

參考解法

方法 1:

There is currently no equivalent to C#'s yield return in VB.Net from a language syntax level.  

However there was a recent write up in MSDN magazine by Bill McCarthy on how to implement a similar pattern in VB.Net 9.0 

  • http://visualstudiomagazine.com/articles/2009/02/01/use‑iterators‑in‑vb‑now.aspx

方法 2:

The new Async CTP includes support for Yield in VB.NET.

See Iterators in Visual Basic for information on usage.

方法 3:

See my answers here:  

  • Yield in VB.NET
  • Iterator pattern in VB.NET (C# would use yield!)

To summarize: VB.Net does not have yield, but C# implements yield by converting your code to a state machine behind that scenes.  VB.Net's Static keyword also allows you to store state within a function, so in theory you should be able to implement a class that allows you to write similar code when used as a Static member of a method.

方法 4:

No yield return in VB.NET :( Just create a list and return it. 

方法 5:

Behind the scenes, the compiler creates an enumerator class to do the work. Since VB.NET does not implement this pattern, you have to create your own implementation of IEnumerator(Of T)

(by CoderDennisJaredParCoderDennisJoel CoehoornbbmudThomas Levesque)

參考文件

  1. Can I implement yield return for IEnumerable functions in VB.NET? (CC BY‑SA 3.0/4.0)

#yield-return #ienumerable #iterator #vb.net






相關問題

Bagaimana saya bisa membuat `menunggu ...` bekerja dengan `yield return` (yaitu di dalam metode iterator)? (How can I make `await …` work with `yield return` (i.e. inside an iterator method)?)

收益回報使用 (yield return usage)

無法將“<>d__6”類型的對象轉換為“System.Object[]”類型 (Unable to cast object of type '<>d__6' to type 'System.Object[]')

使用 yield return 時 GetEnumerator() 方法會發生什麼? (What happens to GetEnumerator() method when yield return is used?)

抓取回調函數 (Scrapy callback function)

我可以在 VB.NET 中為 IEnumerable 函數實現收益返回嗎? (Can I implement yield return for IEnumerable functions in VB.NET?)

使用具有代碼訪問安全性的 C# 迭代器方法時出現問題 (Problem using C# iterator methods with code access security)

如何使用收益返回和遞歸獲得每個字母組合? (How do I get every combination of letters using yield return and recursion?)

是否可以使用 'yield' 來生成 'Iterator' 而不是 Scala 中的列表? (Is it possible to use 'yield' to generate 'Iterator' instead of a list in Scala?)

yield return 除了 IEnumerable 之外還有其他用途嗎? (Does yield return have any uses other than for IEnumerable?)

這個函數可以用更有效的方式編寫嗎? (Can this function be written in more efficient way?)

當我在代碼中引入產量時,它在 python 中不起作用 (when i introduced yield in code it doesn't work in python)







留言討論