我很难记住如何(但不是为什么)使用 IEnumeratorS在C#中。我习惯了Java的精彩文档,可以很好地向初学者解释一切。所以请忍受我。

我尝试从这些董事会上的其他答案中学习,但无济于事。我没有提出以前已经提出过的通用问题,而是一个具体的例子,可以为我澄清事情。

假设我有一种需要通过的方法 IEnumerable<String> 目的。所需要做的所有方法是加入字母 roxxors 到每个人的尽头 String 在迭代器中。然后它将返回这个新的迭代器(当然是原始的 IEnumerable 对象留下来)。

我该怎么做?当然,此处的答案还应帮助许多有关这些对象的基本问题。

有帮助吗?

解决方案

这是关于 IEnumerator. 。它们被用来获取列表的值,其中长度不一定提前知道(即使可能是)。这个词来自 enumerate, ,这意味着“倒数或一个一个命名”。

IEnumeratorIEnumerator<T> 由所有人提供 IEnumerableIEnumerable<T> 界面(后者提供两者都提供)在.net中 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(**) 只是句法糖 (*).

如果我正确理解您,那么在C#中 yield return 我想的是编译器魔术。

例如

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

我会做类似的事情:

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

简单的东西:)

另外,您可以使用Linq的选择方法:

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top