是否可以提高枚举数并在lambda中获取其值?
时间:2020-03-05 18:56:06 来源:igfitidea点击:
如果我有一个IEnumerator变量,是否可以有一个lambda函数来使用它,将其与MoveNext()一起使用,并在每次调用时返回Current值?
解决方案
回答
Lambda表达式可以包含复杂的语句,因此我们可以执行以下操作:
Func<IEnumerator, object> f = ie => { ie.MoveNext(); return ie.Current; };
回答
e => e.MoveNext() ? e.Current : null
这将使枚举器前进并返回当前值,并在枚举完成时返回null。
回答
这是你想要的?
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 + " "); }
IEnumerator的意义在于我们已经可以使用语法糖来处理它:
foreach (string str in strings) Console.Write(str + " ");
在这种情况下,即使直接处理枚举器也看起来更干净:
while (e.MoveNext()) Console.Write(e.Current + " ");
回答
在安倍的解决方案的扩展上,我们还可以使用闭包来保存对枚举数的引用:
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)); }