如果我有一个 IEnumerator 变量,是否可以有一个 lambda 函数来接受它,用 MoveNext() 推进它并在每次调用它时返回当前值?
George Mauer
问问题
1893 次
4 回答
4
e => e.MoveNext() ? e.Current : null
这将推进枚举器并返回当前值,并在枚举完成时返回 null。
于 2008-09-16T14:36:12.427 回答
1
Lambda 表达式可以包含复杂的语句,因此您可以执行以下操作:
Func<IEnumerator, object> f = ie => { ie.MoveNext(); return ie.Current; };
于 2008-09-16T14:33:00.593 回答
0
这是你想要的?
List<string> strings = new List<string>()
{
"Hello", "I", "am", "a", "list", "of", "strings."
};
IEnumerator<string> e = strings.GetEnumerator();
Func<string> f = () => e.MoveNext() ? e.Current : null;
for (; ; )
{
string str = f();
if (str == null)
break;
Console.Write(str + " ");
}
an 的要点IEnumerator
是您已经获得了处理它的语法糖:
foreach (string str in strings)
Console.Write(str + " ");
在这种情况下,即使直接处理枚举器看起来也更干净:
while (e.MoveNext())
Console.Write(e.Current + " ");
于 2008-09-16T14:38:54.980 回答
0
扩展 Abe 的解决方案,您还可以使用闭包来保存对枚举器的引用:
var iter = ((IEnumerable<char>)"hello").GetEnumerator();
//with closure
{
Func<object> f =
() =>
{
iter.MoveNext();
return iter.Current;
};
Console.WriteLine(f());
Console.WriteLine(f());
}
//without closure
{
Func<IEnumerator, object> f =
ie =>
{
ie.MoveNext();
return ie.Current;
};
Console.WriteLine(f(iter));
Console.WriteLine(f(iter));
}
于 2008-09-16T14:40:14.210 回答