简单的IEnumerator使用(举例)
我有困难记住如何(但不是为什么)在C#中使用IEnumerator
s。 我已经习惯了Java,它的精彩文档能够很好地解释初学者的一切。 所以,请和我一起承受。
我试图从这些委员会的其他答案学习无济于事。 我没有提出一个已经被问过的通用问题,而是一个具体的例子来为我澄清事情。
假设我有一个方法需要传递一个IEnumerable<String>
对象。 所有的方法需要将字母roxxors
连接到迭代器中每个String
的末尾。 然后它将返回这个新的迭代器(当然原来的IEnumerable
对象保持原样)。
我将如何去做这件事? 当然,除了我之外,这里的答案应该可以帮助很多关于这些对象的基本问题。
这里是关于IEnumerator
的文档。 它们被用来获取列表的值,其中的长度不一定是提前知道的(尽pipe可能是)。 这个词来自enumerate
,意思是“一个一个地计数或者一个一个的命名”。
IEnumerator
和IEnumerator<T>
由所有IEnumerable
和IEnumerable<T>
接口(后者提供了这两个接口)通过GetEnumerator()
在.NET中提供。 这很重要,因为foreach
语句被devise为通过这些接口方法直接与枚举器一起工作。
举个例子:
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"; } }
使用yield结构 ,或简单地
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的Select Method:
var source = new[] { "Line 1", "Line 2" }; var result = source.Select(s => s + " roxxors");
在这里阅读更多Enumerable.Select方法