如何将价值传递给迭代器
在JavaScript中,我们有yield运算符,该操作员能够通过next()方法返回提供给生成器的值.来自 参数 value可选 发送到发电机的值. 该值将由于yield表达式而分配.例如,在variable = yield expression中,传递给.next()函数的值将分配给variable. and 返回值 返回传递给发电机的next()方法以恢复执行的可选值. 在c#中,我理解相当于Generator.prototype.next()的粗糙 IEnumerator.MoveNext() .但是,尽管next()采用可选的value参数,但在MoveNext()中没有任何等效参数. . 我真的很想能够将值传递给c#迭代器,就像我可以将值传递给JavaScript生成器一样.我想我可以尝试使用频道等,但是我希望利用句法糖C#自己的yield运算符提供.有人知道这是否可能吗? 解决方案 好的,在解决这个问题之后,这是一个回答的
34 2024-04-26
编程技术问答社区
如何创建一个动态类型的C#迭代器块?
我正在做一种aop层,我想返回一个迭代块以获取通用集合(即诸如" iEnumerable"之类的东西).但是,T型是动态发现的.我可以找到该类型并在本地作为"类型"变量,但是如何超越该变量并返回该动态发现类型的迭代器块? 我想要的是这样的东西(我可以在传统的C#中表达它很近): public IEnumerator EntryIteratorBlock(Type desiredElementType) { // One can assume that desireElementType is the same as (or convertible to) runtimeDiscoveredType TypeConverter tc = new TypeConverter() var actualItem = ....; // some code goes here to pick up the ac
16 2024-04-25
编程技术问答社区
实现一个缓冲区,从多个线程写入数据?
我的程序使用迭代器在地图上遍历遍历,并从读取迭代器中衍生出许多工作线程来处理 point ,这一切都很好.现在,我想为每个点编写输出,为此,我正在使用一个内存缓冲区来确保以正确的顺序从线程收集数据,然后再将其写入文件(通过另一个迭代器来写作) : public class MapMain { // Multiple threads used here, each thread starts in Run() // requests and processes map points public void Run() { // Get point from somewhere and process point int pointIndex = ... bufferWriter.StartPoint(pointIndex); // Perform a number of compu
10 2024-04-25
编程技术问答社区
迭代器的错误(更可能是)一个非常微妙的行为?
My problem requires 3 (not too long functions) to reproduce (VS2010/.NET 4) In the first case, my IEnumerable is not evaluated (through the ToList() method) I can't see why.. //Main program private void ButtonTest_Click(object sender, RoutedEventArgs args) { int[] indexes = new int[] { 2, 2, 2, 2, 2, 2 }; var query = Odometer(indexes); // 1) Iterator not evaluated ??? var temp = query.ToList(); MessageBox.S
12 2024-04-24
编程技术问答社区
为什么迭代器在异常时的表现与LINQ枚举器不同?
我正在研究 iterator 方法,方法,方法,方法,而且我注意到 LINQ枚举器保持活跃.它跳过了一个项目,但继续产生更多. 迭代器枚举器已完成.它不会再产生任何项目. 示例. IEnumerator顽固地枚举直到完成: private static void StubbornEnumeration(IEnumerator enumerator) { using (enumerator) { while (true) { try { while (enumerator.MoveNext()) { Console.WriteLine(enumerator.Current); } Console.
4 2024-04-24
编程技术问答社区
收益-收益延迟迭代问题
我知道收益率的回报利用了懒惰的加载,但我想知道我可能会滥用迭代器还是很可能需要重构. 我的递归迭代方法返回给定PageNode的所有祖先,包括pageNode本身. public class PageNodeIterator { //properties and constructor left out for brevity public IEnumerable ancestorsOf(IPageNode pageNode) { if(pageNode == null) throw new ArgumentNullException(("pageNode")); if (pageNode.url != pageNodeService.rootUrl) { yield return pageNode; if (pageNode.parent != null
10 2024-04-23
编程技术问答社区
了解迭代器区块和处置方法
我正在看乔恩·斯基特(Jon Skeet)的问题: 代码打印完成后发生了什么.我的意思是为什么 iterator.MoveNext() 失败? CODE: class IteratorBlocks { public static IEnumerable GetStringsForever() { string current = ""; char nextChar = 'a'; try { while (true) { current += nextChar; nextChar++; if (nextChar > 'z')
8 2024-04-23
编程技术问答社区
在迭代器中访问C#基类会导致ReSharper警告
我有两个类,GenericList和SpecificList,其中SpecificList从GenericList继承. GenericList实现IEnumerable和SpecificList实现IEnumerable. SpecificItem从GenericItem继承.由于它们实现IEnumerable,因此我必须在GenericList和SpecificList中实现GetEnumerator.在GenericList中,这很容易,我只是退还了基础List的枚举者: public IEnumerator GetEnumerator() { return genericItemsList.GetEnumerator(); } 但是,在SpecificList中,这似乎更棘手.将IEnumerator施放到IEnumerator
10 2024-04-23
编程技术问答社区
如何在Unity中的冠词中设置旁观者的位置?
我有一些功能,可以采用敌人实例并更改其一个领域.敌人类有一些基本领域,例如速度,损坏,攻击范围.每个函数仅存储敌人的正常值之一,然后将当前字段更改为一定的时间,然后将其更改回正常状态(i以统一性为单位,并为此使用coroutine).区别在于要存储哪个字段(速度,损坏或攻击范围等).因此,我想制作一个单个函数,该功能接纳要返回要更改的字段的代表: delegate ref float Stat(); private IEnumerator EnemyStatModify(Enemies enemy, float duration, float percent, Stat stat) { ref float enemyStat = ref stat(); float normalStat = enemyStat; enemyStat *= (1 - percent); yield return new WaitForSeconds(duration)
8 2024-04-22
编程技术问答社区
创建节省空间的快照集
我收到了我不知道如何解决的采访问题. 设计快照集功能. 拍摄快照后,类的迭代器应仅返回函数中存在的值. 类应提供add,remove和contains功能.迭代器始终返回快照中存在的元素,即使在快照后可以从集合中删除元素. 当迭代函数称为 时拍摄集合的快照. interface SnapshotSet { void add(int num); void remove(num); boolean contains(num); Iterator iterator(); // the first call to this function should trigger a snapshot of the set } 访调员说,空间要求是我们无法在调用Iterator时创建整个键列表的副本(快照). 第一步是仅处理一个要创建的迭代器并一次迭代.后续问题:如何处理多个迭代器的方案? 一个例子: Snapshot
8 2024-04-22
编程技术问答社区
C#5 ReadAsync and Iterators
我试图将以下类转换为懒惰的返回文件. public class ObservableFile2 : IObservable { private readonly IObservable subject; public ObservableFile2(string fileName) { subject = Observable.Using ( () => new StreamReader(new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read)), streamReader => ObserveLines(streamReader) ); } priv
10 2024-04-21
编程技术问答社区
用于传递给迭代器的价值类型的可变包装器
我正在编写一个需要传递可变整数的迭代器. public IEnumerable Foo(ref int valueThatMeansSomething) { // Stuff yield return ...; } 这使我赢得了"错误476迭代器不能具有参数或输出参数". 我需要的是要在迭代器中修改的整数值,并由迭代器的呼叫者使用.换句话说,上面的任何调用Foo()都希望知道valueThatMeansSomething和Foo()的终点可能使用它.真的,我想要一个是参考类型而不是值类型的整数. 我唯一能想到的是写一个封装我整数并允许我修改的类. public class ValueWrapper where T : struct { public ValueWrapper(T item) { this.Item = item; } public T Item { get;
12 2024-04-20
编程技术问答社区
为什么C#中有些迭代器比其他迭代器快?
某些迭代器更快.我之所以找到这个,是因为我从我习惯于做这样的事情来设置数组值: testArray[0] = 0; testArray[1] = 1; 这是一个简化的示例,但是为了不复制和粘贴,或者不再次键入内容,我想我应该使用循环.但是我有一种令人讨厌的感觉,即循环比简单列出命令要慢,而且看起来我是对的:列出的东西要快得多.在我的大多数试验中,最快到最慢的速度是列表,do循环,for循环,然后是时循环. 为什么列出事物比使用迭代器更快,为什么迭代器不同? 如果我没有以最有效的方式使用这些迭代器,请帮助我. 这是我的结果(对于2个int数组),我的代码在下面(对于4个int数组).我在Windows 7 64位上尝试了几次. 我要么不擅长迭代,要么使用迭代器并不像所做的那样大.请让我知道是哪个.非常感谢. int trials = 0; TimeSpan listTimer = new TimeSpan(0, 0, 0, 0); TimeSpan
8 2024-04-19
编程技术问答社区
迭代器块的测试覆盖率结果很奇怪,为什么这些语句没有被执行?
我正在使用dotcover来分析我的单位测试的代码覆盖范围,而且我得到了一些奇怪的结果...我有一个迭代方法,该方法未完成覆盖范围,但未涵盖的语句只是方法末尾的闭合牙套. 这是我正在测试的方法: public static IEnumerable CommonPrefix( this IEnumerable source, IEnumerable other, IEqualityComparer comparer) { source.CheckArgumentNull("source"); other.CheckArgumentNull("other"); return source.CommonPrefixImpl(other, comparer); } private static IEnumerable
4 2024-04-18
编程技术问答社区
巧妙利用.Net 2的迭代器
c#2和vb.net 8引入了一个新功能,称为然而,迭代器实际上是 coroutines ,可以用来做很多很多,可以用来做很多有用的事物与对象集合无关. 您在真实代码中看到了哪些非标准用途? 解决方案 我用它们在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 'th
12 2024-04-18
编程技术问答社区
对列表<T>字段进行平均计数
我有a列表,我想在其字段上计数平均值. 最好的方法是什么? class A { int a; int b; } void f() { var L = new List(); for (int i=0; i具有将Func作为参数的超载. using System.Linq; list.Average(item => item.a); 其他解决方案 您可以尝试此方法: var average = ListOfA.Select(x=>x.a).Average(); 其中ListOfA是类型A的对象列表. 其他解决方案 您可以使用var average = L.Select(r => r.a).Average();
10 2024-04-18
编程技术问答社区
迭代器块和继承
给定带有以下接口的基类: public class Base { public virtual IEnumerable GetListOfStuff() { yield return "First"; yield return "Second"; yield return "Third"; } } 我想做一个衍生的类,覆盖该方法,并添加自己的东西,例如: public class Derived : Base { public override IEnumerable GetListOfStuff() { foreach (string s in base.GetListOfStuff()) { yield return s; } yield return "Fou
6 2024-04-18
编程技术问答社区
C#中的ienumerables?
是否有一种简单的内置方式来获取IEnumerable s的有序列表并返回单个IEnumerable,该IEnumerable按顺序产生第一个元素,然后是第二个元素,然后是第二个元素. 我当然可以写自己的书,但是我想知道是否已经有一种方法可以完成这项看似有用的任务. 解决方案 尝试SelectMany. IEnumerable Collapse(IEnumerable> e){ return e.SelectMany(x => x ); } 此功能的目的是将一组Ienumerable >弄平为iEnumerable .返回的数据将保留原始订单. 其他解决方案 进一步到Jaredpar的(正确)答案 - 还查询语法: var all = from inner in outer from item in inner select item; 其他解决方案 进一步到基于L
10 2024-04-18
编程技术问答社区
实现C#收益率语句的算法
我很想自己弄清楚它,但我想知道大致是将函数用屈服语句转换为枚举机器的算法是什么?例如,C#如何转动: IEnumerator strings(IEnumerable args) { IEnumerator enumerator2 = getAnotherEnumerator(); foreach(var arg in arg) { enumerator2.MoveNext(); yield return arg+enumerator.Current; } } 进入这个: bool MoveNext() { switch (this.state) { case 0: this.state = -1; this.enumerator2 = getAnotherEnumerator();
12 2024-04-17
编程技术问答社区