简单的IEnumerator使用(带示例)

Bla*_*ble 66 c# ienumerator

我在记住如何(但不是为什么)IEnumerator在C#中使用s 时遇到了麻烦.我已经习惯了Java的精彩文档,可以很好地向初学者解释一切.所以拜托,请耐心等待.

我试过从这些板上的其他答案中学习无济于事.我没有问过之前已经提出的一般性问题,而是有一个具体的例子可以为我澄清一些事情.

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

我该怎么做?当然,除了我之外,这里的答案应该可以帮助许多人解决有关这些对象的基本问题.

Pau*_*lls 97

这是关于的文档IEnumerator.它们用于获取列表的值,其中长度不一定是提前知道的(即使它可能是).这个词来自enumerate,意思是"逐一计数或命名".

IEnumerator并且IEnumerator<T>由.NET中的所有IEnumerableIEnumerable<T>接口(后者提供两者)提供GetEnumerator().这很重要,因为该foreach语句旨在通过这些接口方法直接与枚举器一起工作.

例如:

IEnumerator enumerator = enumerable.GetEnumerator();

while (enumerator.MoveNext())
{
    object item = enumerator.Current;
    // Perform logic on the item
}
Run Code Online (Sandbox Code Playgroud)

变为:

foreach(object item in enumerable)
{
    // Perform logic on the item
}
Run Code Online (Sandbox Code Playgroud)

至于您的特定场景,.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();
}
Run Code Online (Sandbox Code Playgroud)

  • @BlackVegetable`IEnumerator`是只读的,但是,`IEnumerable`通常可以被强制转换为它的可变类型(例如`((List <string>)foo.ReadOnlyValues).Add("哈哈!对于只读的sucker来说太多了! ")`) - 假设`IEnumerable`保护你不要这样做时要小心. (8认同)
  • 不要忘记`Dispose()` IEnumerator! (2认同)

Run*_*une 18

public IEnumerable<string> Appender(IEnumerable<string> strings)
{
  List<string> myList = new List<string>();
  foreach(string str in strings)
  {
      myList.Add(str + "roxxors");
  }
  return myList;
}
Run Code Online (Sandbox Code Playgroud)

要么

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

使用yield构造,或简单地

var newCollection = strings.Select(str => str + "roxxors"); //(*)
Run Code Online (Sandbox Code Playgroud)

要么

var newCollection = from str in strings select str + "roxxors"; //(**)
Run Code Online (Sandbox Code Playgroud)

其中后者使用LINQ而且(**)只是语法糖(*).


Ben*_*son 8

如果我理解正确,那么在c#中,yield return我认为编译器魔法就是你所需要的.

例如

IEnumerable<string> myMethod(IEnumerable<string> sequence)
{
    foreach(string item in sequence)
    {
         yield return item + "roxxors";
    }
}
Run Code Online (Sandbox Code Playgroud)


Mik*_*ike 5

我会这样做:

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

简单的东西:)

  • 我似乎记得你应该尽量不要在声明为 IEnumerable 的方法中返回 List。原因是人们可能会“欺骗”并注意到它实际上是一个列表并开始用它做列表。List(实际上是所有 IEnumerables)确实有一个 AsEnumerable() 方法,我认为应该调用和返回它。 (2认同)