简单的 IEnumerator 使用(附示例)

我记不住如何(但不记得为什么)在 C # 中使用 IEnumerator。我已经习惯了 Java 的精彩文档,它向初学者很好地解释了一切。所以请忍耐一下。

我试着从这些黑板上的其他答案中学习,但没有用。我没有问一个以前已经被问过的一般性问题,而是用一个具体的例子来为我澄清一些事情。

假设我有一个需要传递 IEnumerable<String>对象的方法。该方法所需要做的就是将字母 roxxors连接到迭代器中每个 String的末尾。然后它将返回这个新迭代器(当然原来的 IEnumerable对象保持不变)。

我该怎么做?当然,除了我之外,这里的答案还可以帮助很多人解答关于这些对象的基本问题。

200669 次浏览

我会这样做:

private IEnumerable<string> DoWork(IEnumerable<string> data)
{
List<string> newData = new List<string>();
foreach(string item in data)
{
newData.Add(item + "roxxors");
}
return newData;
}

简单的东西:)

如果我理解正确,那么在 c # 的 yield return编译器魔术是所有你需要我认为。

例如:。

IEnumerable<string> myMethod(IEnumerable<string> sequence)
{
foreach(string item in sequence)
{
yield return item + "roxxors";
}
}

下面是关于 IEnumerator的文档。它们用于获取列表的值,其中的长度不一定提前知道(即使它可以知道)。这个词来自 enumerate,意思是“一个一个地数数或者说出名字”。

中的所有 IEnumerableIEnumerable<T>接口(后者同时提供这两个接口)提供了 IEnumeratorIEnumerator<T>。NET via GetEnumerator().这一点很重要,因为 foreach语句被设计为通过这些接口方法直接使用枚举器。

例如:

IEnumerator enumerator = enumerable.GetEnumerator();


while (enumerator.MoveNext())
{
object item = enumerator.Current;
// Perform logic on the item
}

成为:

foreach(object item in enumerable)
{
// Perform logic on the item
}

对于特定的场景,.NET 中几乎所有的集合都实现了 IEnumerable:

public IEnumerator Enumerate(IEnumerable enumerable)
{
// List implements IEnumerable, but could be any collection.
List<string> list = new List<string>();


foreach(string value in enumerable)
{
list.Add(value + "roxxors");
}
return list.GetEnumerator();
}
public IEnumerable<string> Appender(IEnumerable<string> strings)
{
List<string> myList = new List<string>();
foreach(string str in strings)
{
myList.Add(str + "roxxors");
}
return myList;
}

或者

public IEnumerable<string> Appender(IEnumerable<string> strings)
{
foreach(string str in strings)
{
yield return str + "roxxors";
}
}

使用 产量结构,或简单地

var newCollection = strings.Select(str => str + "roxxors"); //(*)

或者

var newCollection = from str in strings select str + "roxxors"; //(**)

后两者使用 LINQ,而 (**)只是 (*)的句法糖。

你也可以使用 LINQ 的选择方法:

var source = new[] { "Line 1", "Line 2" };


var result = source.Select(s => s + " roxxors");

在这里阅读更多 可枚举。选择方法