IEnumerator casting? C#
本文关键字:casting IEnumerator | 更新日期: 2023-09-27 18:15:40
我正在学习IEnumerator和IEnumerable [c#的新知识]。我正试图从这个代码示例中学习:
class colors : IEnumerable , IEnumerator
{
private string[] cols;
private int iCurrent;
public colors()
{
cols = new string[] { "Red", "White", "Blue", "Yellow" };
iCurrent = -1;
}
public IEnumerator GetEnumerator()
{
return (IEnumerator)this;
}
}
有更多的代码,但我的问题是关于最后一行。
首先,我不明白将返回什么,不完全理解这行代码。它是一个colorienumerator类型,还是一个字符串类型。这个指向哪里/在什么上?
其次,在CPP中,我记得我创建了迭代器,例如: std::map<object>::iterator it
,然后在for[需要添加it.begin(), it.end()]循环中使用它。现在我明白了c#,在我创建了这个迭代器/IEnumerator之后,有了foreach循环,它将为我省去所有这些麻烦。但是有没有一种方法可以更容易/更快地创建它们呢?
是否有一种方法可以更容易/更快地创建枚举数?是的,用yield return
声明。https://msdn.microsoft.com/en-us/library/9k7k7cf0.aspx声明一个返回IEnumerable的方法,并在其中完成所有迭代。不需要MoveNext, Reset或Current
实现IEnumerator
应该留给实现您自己的自定义容器(就像在c++中实现hashset一样)。IEnumerable
返回Object
类型的值,由容器实现,足以使用foreach
。IEnumerable<string>
是更强类型的版本,可能是您在这里想要的。
在您的示例中使用的字符串数组允许您枚举其内容为Strings
。下面是一些使用IEnumerator
和IEnumerator<string>
而不自己实现枚举器的示例;也许他们会带你去你想去的地方:
using System;
using System.Collections;
using System.Collections.Generic;
public class Colors : IEnumerable, IEnumerator
{
private readonly string[] cols = new[] { "Red", "White", "Blue", "Yellow" };
public IEnumerator GetEnumerator()
{
return cols.GetEnumerator();
}
}
public class Colors2
{
private readonly string[] cols = new[] { "Red", "White", "Blue", "Yellow" };
public IEnumerable<string> Colors
{
get { return cols; }
}
}
class Program
{
static void Main(string[] args)
{
Test();
Test2();
Test3();
}
private static void Test()
{
var colors = new Colors();
foreach (var c in colors)
{
// c is of type Object here because it's IEnumerable.
Console.WriteLine(c);
}
}
private static void Test2()
{
var colors2 = new Colors2();
foreach (var c in colors2.Colors)
{
// c is of type String here because it's IEnumerable<string>.
Console.WriteLine(c);
}
}
private static void Test3()
{
foreach (var c in new[] { "Red", "White", "Blue", "Yellow" })
{
// c is of type String here.
Console.WriteLine(c);
}
}
}