是否可以提高枚举数并在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));
}