Tag: 迭代器

在“for”循环中添加委托更改迭代的方法 – C#问题?

我遇到了C#代码的一些问题。 添加方法以“for”循环委托“i”加1,所以“for(int i = 0,i <x; i ++)”必须更改为“for(int i = -1,i <x- 1; i ++)“正常工作。 这是为什么? 下面的代码抛出IndexOutOfRangeException string[] names = new string[] { “John”, “Madeline”, “Jack”, “Gabby” }; Action showNameDelegate = null; for (int i = 0; i global::System.Console.WriteLine(names[i]); } foreach (Action showName in showNameDelegate.GetInvocationList()) { showName(); } 正确的代码是(查看迭代器“i”,它从-1开始,但“names [-1]”不存在): string[] names = new string[] […]

如果队列上的IEnumerable迭代器应该使项目出列

我创建了一个自定义通用队列,它实现了一个通用的IQueue接口,该接口使用System.Collections.Generic命名空间中的通用Qu​​eue作为私有内部队列。 示例已清除不相关的代码。 public interface IQueue { void Enqueue(TQueueItem queueItem); TQueueItem Dequeue(); } public class CustomQueue : IQueue { private readonly Queue queue = new Queue(); … public void Enqueue(TQueueItem queueItem) { … queue.Enqueue( queueItem ); … } public TQueueItem Dequeue() { … return queue.Dequeue(); … } } 我希望保持与核心实现的一致性,并注意到核心Queue实现了IEnumerable,所以我将通过在类上显式实现IEnumerable或使用IQueue接口inheritance它来做同样的事情。 我想知道的是,当列举队列时,如果每次移动都会使下一个项目出列? 我已经使用reflection器来了解微软是如何做到的,他们所做的就是逐步完成队列私有arrays,但微软远非绝对不可靠,所以我想获得一般意见。 public class CustomQueue : IQueue, […]

为什么有些迭代器比C#中的其他迭代器更快?

一些迭代器更快。 我发现了这一点,因为我从第9频道的 Bob Tabor那里听说永远不会复制和粘贴。 我习惯做这样的事情来设置数组值: testArray[0] = 0; testArray[1] = 1; 这是一个简化的例子,但是为了不复制和粘贴,或者不再输入东西,我想我应该使用循环。 但我有这种唠叨的感觉,循环比简单地列出命令要慢,看起来我是对的:列出的东西要快得多。 在我的大多数试验中,速度,最快到最慢,是列表,do循环,for循环,然后是while循环。 为什么列出事物比使用迭代器更快,为什么迭代器的速度不同? 如果我没有以最有效的方式使用这些迭代器,请帮助我。 这是我的结果(对于2个int数组),我的代码在下面(对于4个int数组)。 我在Windows 7 64位上尝试了几次。 要么我不擅长迭代,要么使用迭代器并不像它的那样伟大。 请告诉我它是哪个。 非常感谢。 int trials = 0; TimeSpan listTimer = new TimeSpan(0, 0, 0, 0); TimeSpan forTimer = new TimeSpan(0, 0, 0, 0); TimeSpan doTimer = new TimeSpan(0, 0, 0, 0); TimeSpan whileTimer = new […]

调试时无法进入迭代器块(C#)

我正在尝试调试从unit testing项目执行的代码,但是当我尝试进入某个方法时,它只是直接进入下一行,并且该方法内的断点未被命中。 该方法位于一个不同项目的类中,但所有代码都是在调试模式下构建的,我尝试过清理和重建解决方案,没有任何乐趣。 但是,这只是因为我在方法中添加了一个迭代器块。 当我删除它并重建时,我可以介入。 奇怪的? 我正在使用Visual Studio 2010 Beta 1,这可能只是一个错误吗?

迭代器块和inheritance

给定具有以下接口的基类: 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 “Fourth”; yield return “Fifth”; } } 但是,我受到了警告,“无法validation通过迭代器中的base关键字访问成员”。 那么这个问题的解决方案是什么?

找出给定长度的所有可能单词的好方法是什么

我正在尝试在C#中创建一个算法,它产生以下输出字符串: AAAA AAAB AAAC …and so on… ZZZX ZZZY ZZZZ 完成此任务的最佳方法是什么? public static IEnumerable GetWords() { //Perform algorithm yield return word; }

为什么我们需要在c#中使用迭代器?

有人可以提供关于迭代器使用的真实例子。 我试着搜索谷歌,但对答案不满意。

.Net 2迭代器的巧妙使用

C#2和VB.Net 8引入了一个名为迭代器的新function,旨在使返回枚举数和枚举数变得更容易。 但是,迭代器实际上是一种有限forms的协同程序 ,可以用来做许多与对象集合无关的有用的东西。 您在实际代码中看到了什么非标准的迭代器用法?

使用迭代器编写自定义IEnumerator

我如何编写一个自定义的IEnumerator实现,它需要维护一些状态并仍然可以使用迭代器块来简化它? 我能想到的最好的是这样的: public class MyEnumerator : IEnumerator { private IEnumerator _enumerator; public int Position {get; private set;} // or some other custom properties public MyEnumerator() { Position = 0; _enumerator = MakeEnumerator(); } private IEnumerator MakeEnumerator() { // yield return something depending on Position } public bool MoveNext() { bool res = _enumerator.MoveNext(); if (res) […]

为什么结构中的迭代器可以修改它?

我发现允许在值类型中使用迭代器方法来修改this 。 但是,由于CLR的限制,调用方法没有看到修改。 ( this是通过值传递的) 因此,迭代器和非迭代器中的相同代码会产生不同的结果: static void Main() { Mutable m1 = new Mutable(); m1.MutateWrong().ToArray(); //Force the iterator to execute Console.WriteLine(“After MutateWrong(): ” + m1.Value); Console.WriteLine(); Mutable m2 = new Mutable(); m2.MutateRight(); Console.WriteLine(“After MutateRight(): ” + m2.Value); } struct Mutable { public int Value; public IEnumerable MutateWrong() { Value = 7; Console.WriteLine(“Inside MutateWrong(): ” […]