Tag: ienumerator

我什么时候应该单独实现IEnumerator ?

在集合的框架类中,我经常看到IEnumerator分别实现为内部类,并且在GetEnumerator方法中返回它的实例。 现在假设我正在编写自己的集合类,它将内置集合,如List或T[]充当内部持有者,如下所示: public class SpecialCollection : IEnumerable { List list; public SpecialCollection() { } public IEnumerator GetEnumerator() { return list.GetEnumerator(); //or return list.Where(x => some logic).GetEnumerator(); //or directly rely on yield keyword yield return x; //etc } } 我应该编写自己的枚举器类,还是可以返回List类的枚举器? 我是否应该编写自己的枚举类? 我也有一个相关的问题。 如果它不是那么重要或没有太大的区别,为什么BCL中的每个集合类都编写自己的IEnumerator ? 例如, List类有类似的东西 T[] items; public IEnumerator GetEnumerator() { return new List.Enumerator(items); }

在foreach循环内手动增加枚举数

我在foreach循环中有一个嵌套的while循环,我希望在满足某个条件时无限期地推进枚举器。 为此,我尝试将枚举器转换为IEnumerator (如果它在foreach循环中必须是这样)然后在已转换对象上调用MoveNext(),但它给出了一个错误,说我无法转换它。 无法通过引用转换,装箱转换,取消装箱转换,包装转换或空类型转换将类型“System.DateTime”转换为System.Collections.Generic.IEnumerator。 foreach (DateTime time in times) { while (condition) { // perform action // move to next item (time as IEnumerator).MoveNext(); // will not let me do this } // code to execute after while condition is met } 在foreach循环中手动增加IEnumerator的最佳方法是什么? 编辑:编辑显示有一个条件满足后我想要执行的w​​hile循环之后的代码这就是为什么我想在内部手动递增然后突破它而不是继续这会让我回到顶部。 如果这是不可能的,我相信最好的事情就是重新设计我是如何做到的。

为什么我们需要IEnumerator和IEnumerable?

好的,我只是在处理IEnumerator和IEnumerable 。 现在MSDN说这些东西的主要目标是遍历客户集合。 很公平,我可以在不使用任何一个的情况下迭代自定义集合(或者至少我想这么认为) namespace ienumerator { class person { public person(string first, string second) { fname = first; lname = second; } public string fname { get; set; } public string lname { get; set; } } class person_list { public person[] list; public person_list(person[] per) { list = new person[per.Length]; for (int i […]

List .Enumerator IEnumerator.Reset()方法实现

尽管事实上, 永远不应该使用IEnumerator.Reset方法,但我在List发现了方法实现的奇怪行为。 无论您如何检查.NET Framework源代码(使用参考源和ILSpy进行尝试),该方法都实现如下: void System.Collections.IEnumerator.Reset() { if (version != list._version) { ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_EnumFailedVersion); } index = 0; current = default(T); } 但是,看起来根本没有调用该方法! 考虑一下代码: var list = new List(1) { 3 }; using (var e = list.GetEnumerator()) { Console.WriteLine(e.MoveNext()); Console.WriteLine(e.Current); ((IEnumerator)e).Reset(); Console.WriteLine(e.MoveNext()); Console.WriteLine(e.Current); } 很明显,它应该打印True和3两次。 而不是结果 True 3 False 0 我错过了任何简单的解释?

在Coroutine中“yield return 0”和“yield return null”之间有什么区别?

我很新,对“ yield ”有点困惑。 但最后我理解使用WaitForSeconds它是如何工作的 但我看不出“ yield return 0 ”和“ yield return null ”之间的区别。 他们都在等待下一帧执行? 对不起,我的英语不好。 非常感谢你。

使用ItemsSource填充WPF ListBox – 好主意?

我是(相对)经验丰富的Cocoa / Objective-C编码器,我正在自学C#和WPF框架。 在Cocoa中,当填充NSTableView ,相对简单地将一个委托和数据源分配给视图。 然后使用这些委托/数据源方法填充表,并确定其行为。 我正在整理一个包含对象列表的简单应用程序,让我们称之为Dog对象,每个对象都有一个public string name 。 这是Dog.ToString()的返回值。 对象将显示在ListBox ,我想使用与Cocoa的NSTableViewDataSource类似的模式填充此视图。 它目前似乎正在使用: public partial class MainWindow : Window, IEnumerable { public Pound pound = new Pound(); public MainWindow() { InitializeComponent(); Dog fido = new Dog(); fido.name = “Fido”; pound.AddDog(fido); listBox1.ItemsSource = this; Dog spot = new Dog(); spot.name = “Spot”; pound.AddDog(spot); } public […]

将CollectionBase转换为可与Linq一起使用的List或数据类型

我正在使用Aspose单元来操作Excel电子表格。 API中的一种类型是电子表格中的图片集合,它源自CollectionBase: 请看这个链接: http : //www.aspose.com/documentation/.net-components/aspose.cells-for-.net/aspose.cells.pictures.html 我想将此类型转换为允许我使用Linq表达式的东西 有什么选择? 我想我可以迭代它并手动将其添加到new List但是有更好的方法吗? 我已经读过这个问题将IEnumerable 添加到派生自CollectionBase的类中 但我显然无法控制实现CollectionBace的类,因为它是第三方产品

实现IEnumerable 和IEnumerable.GetEnumerator()不能公开,为什么?

要实现接口成员,实现类的相应成员必须是公共的。 source: 接口(C#编程指南) 我知道它是私有的,但我想知道它为什么不公开?

如果我可以定义一个GetEnumerator,为什么要实现IEnumerable(T)?

更新 :我感谢所有的评论,这些评论基本上都是一致的反对意见。 虽然提出的每一项反对意见都是有效的,但我觉得棺材中的最终指甲是Ani的敏锐观察 ,最终,即使是这个想法表面上提供的一个 微不足道的好处 – 消除样板代码 – 也被这个事实所否定。想法本身需要自己的样板代码。 所以,是的,请相信我说:这将是一个坏主意。 而且只是为了有点挽救我的尊严:我可能是为了争论而玩弄它,但我从来没有真正以这个想法开始出售 – 只是好奇地听到其他人不得不说的话。 诚实。 在你将这个问题视为荒谬之前,我请你考虑以下问题: IEnumerableinheritance自* IEnumerable ,这意味着任何实现IEnumerable通常必须实现IEnumerable.GetEnumerator 和 (显式) IEnumerable.GetEnumerator 。 这基本上等于样板代码。 只要该方法使用MoveNext方法和Current属性返回某种类型的对象,您就可以foreach处理具有GetEnumerator方法的任何类型。 因此,如果您的类型使用签名public IEnumerator GetEnumerator()定义一个方法,则使用foreach枚举它是合法的。 显然,有很多代码需要IEnumerable接口 – 例如,基本上所有的LINQ扩展方法。 幸运的是,使用C#通过yield关键字提供的自动迭代器生成,从可以使用的类型转换为IEnumerable是微不足道的。 所以,把这一切放在一起,我有这个疯狂的想法:如果我只是定义我自己的界面,如下所示: public interface IForEachable { IEnumerator GetEnumerator(); } 然后每当我定义一个我想要枚举的类型时,我实现这个接口而不是IEnumerable ,从而无需实现两个GetEnumerator方法(一个显式)。 例如: class NaturalNumbers : IForEachable { public IEnumerator GetEnumerator() { int i = 1; […]

我们可以在不使用IEnumerable接口的情况下使用GetEnumerator()吗?

我有一个名为Primes的类,这个类实现了GetEnumerator()而没有实现IEnumerable接口。 public class Primes { private long min; private long max; public Primes() : this(2, 100) { } public IEnumerator GetEnumerator() {…} 我不明白。 我错过了什么吗?