79

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

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

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

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

4

5 回答 5

109

这是关于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
}

变成:

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();
}
于 2011-09-05T16:20:16.770 回答
19
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";
  }
}

使用yield 构造,或者干脆

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

或者

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

后者使用LINQ并且(**)只是(*).

于 2011-09-05T16:21:18.323 回答
9

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

例如

IEnumerable<string> myMethod(IEnumerable<string> sequence)
{
    foreach(string item in sequence)
    {
         yield return item + "roxxors";
    }
}
于 2011-09-05T16:18:53.790 回答
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;
}

简单的东西:)

于 2011-09-05T16:15:35.537 回答
4

您也可以使用 LINQ 的 Select 方法:

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

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

在这里阅读更多Enumerable.Select 方法

于 2011-09-05T16:36:41.267 回答