C#学习教程:.Net 2迭代器的巧妙使用分享


.Net 2迭代器的巧妙使用

C#2和VB.Net 8引入了一个名为迭代器的新function,旨在使返回枚举数和枚举数变得更容易。

但是,迭代器实际上是一种有限forms的协同程序 ,可以用来做许多与对象集合无关的有用的东西。

您在实际代码中看到了什么非标准的迭代器用法?

我用它们在ASP.NET中编写一个系统来创建一系列链接页面交互。 如果您将用户与网站的对话想象为一系列请求和响应,则可以将交互建模为IEnumerable 。 从概念上讲,就像这样;

 IEnumerable SignupProcess(FormValues form) { // signup starts with a welcome page, asking // the user to accept the license. yield return new WelcomePageResponse(); // if they don't accept the terms, direct // them to a 'thanks anyway' screen if (!form["userAcceptsTerms"]) { yield return new ThanksForYourTimePageResponse(); yield break; } // On the second page, we gather their email; yield new EmailCapturePage(""); while(!IsValid(form["address"])) { // loop until we get a valid address. yield return new EmailCapturePage("The email address is incorrect. Please fix."); } } 

您可以将迭代器存储在会话状态中,这样当用户返回到站点时,您只需将迭代器拉出,将迭代器移动到下一页,然后将其返回以进行渲染。 复杂的站点交互在一个地方编码。

开始时:

我用它来递归迭代文件夹,子文件夹等中包含的文件。 对于我必须执行特定操作的每个文件。 具有“收益率返回”语句的递归函数对于每个人的其他理解都很简单。

在我发现lazy yield运算符之前,我写了这个函数。 这递归地构建一个大型迭代器并返回它。 它不是很有效但我认为它很聪明。

 static member generatePrimeNumbers max = let rec generate number numberSequence = if number * number > max then numberSequence else let filteredNumbers = numberSequence |> Seq.filter (fun v -> v = number || v % number <> 0L) let newNumberSequence = seq { for i in filteredNumbers -> i } let newNumber = newNumberSequence |> Seq.find (fun x -> x > number) generate newNumber newNumberSequence generate 2L (seq { for i in 2L..max -> i }) 

Rhino.ETL大量使用它来组合输入序列上的转换

例如,可以组合,重复使用的3个操作

上述就是C#学习教程:.Net 2迭代器的巧妙使用分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—猴子技术宅(www.ssfiction.com)

 public IEnumerable Execute(IEnumerable rows) { foreach(var line in File.EnumerateLines()) { var row = new Row(); row["key"] = int.Parse(line.Substring(1)); yield return row; } } public IEnumerable Execute(IEnumerable rows) { foreach(var row in rows) { var value = (int)row["key"]; row["key"] = value + 2; yield return row; } } public IEnumerable Execute(IEnumerable rows) { using (var file = new Streamwriter(filename)) { foreach(var row in rows) { file.WriteLine(row["key"]); yield return row; } } } 

本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

如若转载,请注明出处:https://www.ssfiction.com/ckf/1301187.html

(0)
上一篇 2023年1月9日 下午1:40
下一篇 2023年1月9日 下午2:29

精彩推荐