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