C# 简单IEnumerator使用(附示例)

C# 简单IEnumerator使用(附示例),c#,ienumerator,C#,Ienumerator,我很难记住如何使用C语言中的IEnumerators,但不知道为什么。我已经习惯了Java,它的精彩文档非常好地向初学者解释了一切。所以请容忍我 我试着从这些董事会的其他答案中学习,但都没有用。我没有问以前已经问过的一般性问题,而是举了一个具体的例子来说明问题 假设我有一个需要传递IEnumerable对象的方法。该方法需要做的就是将字母roxor连接到迭代器中每个字符串的末尾。然后它将返回这个新的迭代器。当然,原始IEnumerable对象保持原样 我该怎么办?当然,除了我之外,这里的答案还可

我很难记住如何使用C语言中的IEnumerators,但不知道为什么。我已经习惯了Java,它的精彩文档非常好地向初学者解释了一切。所以请容忍我

我试着从这些董事会的其他答案中学习,但都没有用。我没有问以前已经问过的一般性问题,而是举了一个具体的例子来说明问题

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

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

我会做一些类似的事情:

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语言中,我想您所需要的就是收益率返回编译器的魔力

e、 g


这是有关的文档。它们用于获取列表的值,其中的长度不一定提前知道,即使可以提前知道。这个词来自enumerate,意思是一个接一个地数数或命名

IEnumerator和IEnumerator由所有IEnumerable和IEnumerable接口提供,后者通过GetEnumerator在.NET中提供这两个接口。这一点很重要,因为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();
}


如果后面两个使用and**只是*

的语法糖,那么您也可以使用LINQ的Select方法:

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

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

此处阅读更多信息

foreach不调用重置。它是用于COM互操作的,并不是所有的枚举数都支持它,事实上大多数枚举数都不支持它。枚举数是只读的,对吗?如何使用这种模式返回包含修改的枚举数类型?@BlackPlanet IEnumerator是只读的,但是,IEnumerable通常可以转换回其可变类型,例如Listfoo.ReadOnlyValues.AddHahaha!只读吸盘就这么多所以,假设IEnumerable可以保护您免受此影响时要小心。@JonathanDickinson呃。。。事实上,这是失败的。典型的模式是返回带有新值的新IEnumerable。这允许客户机代码决定何时对可枚举的每个元素求值,而不是强制所有元素同时求值!这是我的第一个想法。但是,与之交互的其他方法要求我返回IEnumerable类型或类似的类型。谢谢你的回复@黑蔬菜:列表是一个IEnumerable。是的,有更好的方法使用yield来实现这一点,我似乎记得您不应该尝试在声明为IEnumerable的方法中返回列表。原因是人们可能会作弊,并注意到它实际上是一个列表,然后开始用它做列表上的事情。事实上,所有IEnumerables都有一个AsEnumerable方法,我认为应该调用并返回它?或者它会返回某种IEnumerable对象吗?@BlackPlanet是的,它会返回一个IEnumerable对象,每当使用foreachYes直接或间接调用MoveNext时,它都会生成一个字符串。是的,它是语法糖,它告诉编译器将其转换为迭代器块。看这里,这是正确的方法,应该上升。被接受的答案必须在返回之前构建整个列表,而不是遵循IEnumerable design。LINQ的有趣模式。我得研究一下。谢谢大家的迅速帮助!我似乎记得,您不应该在声明为IEnumerable的方法中返回列表。原因是人们可能会作弊,并注意到它实际上是一个列表,然后开始用它做列表上的事情。实际上,所有IEnumerables都有一个可计算的方法,我认为应该调用并返回该方法。否则,产量和linq响应的最高答案:如果你计划用C语言进行大量的开发,你肯定会想在LINQ上投入一些时间-这会节省你很多时间,让你对代码感觉更好:-@chris:calling.AsEnumerable做不了多少事:-@rune:这是过去的一点爆炸您是对的,IEnumerables上的一个可计算方法没有任何用处。我的推理仍然合理,但需要一种不同的方法来停止作为列表进行回溯,例如Selectgx=>x。
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"; //(**)
var source = new[] { "Line 1", "Line 2" };

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