题
我很难记住如何(但不是为什么)使用 IEnumerator
S在C#中。我习惯了Java的精彩文档,可以很好地向初学者解释一切。所以请忍受我。
我尝试从这些董事会上的其他答案中学习,但无济于事。我没有提出以前已经提出过的通用问题,而是一个具体的例子,可以为我澄清事情。
假设我有一种需要通过的方法 IEnumerable<String>
目的。所需要做的所有方法是加入字母 roxxors
到每个人的尽头 String
在迭代器中。然后它将返回这个新的迭代器(当然是原始的 IEnumerable
对象留下来)。
我该怎么做?当然,此处的答案还应帮助许多有关这些对象的基本问题。
解决方案
这是关于 IEnumerator
. 。它们被用来获取列表的值,其中长度不一定提前知道(即使可能是)。这个词来自 enumerate
, ,这意味着“倒数或一个一个命名”。
IEnumerator
和 IEnumerator<T>
由所有人提供 IEnumerable
和 IEnumerable<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");
在这里阅读更多 枚举。选择方法
不隶属于 StackOverflow