反转lambien函数的无数

Ale*_*lex 1 .net c# c#-4.0

我已经使用这个函数创建了一个可以相互作用的lambda函数

    static IEnumerable<Func<int>> MakeEnumerator(int[] values)
    {
        for (int a = 0; a < values.Length; a++)
        {
            yield return () => Values[a];
        }
    }
Run Code Online (Sandbox Code Playgroud)

我无法使用LINQ将其反转或转换为数组,而不会将所有值变为最后一个函数.示例代码(注意这只是演示了问题,它不是应用程序中的代码):

        int[] start = {1,2,3};

        IEnumerable<Func<int>> end = MakeEnumerator(start).Reverse<Func<int>>();

        foreach (Func<int> i in end)
        {
            Console.WriteLine(i());
        }
Run Code Online (Sandbox Code Playgroud)

我认为问题出在MakeEnumerator函数中.我如何修改它以使其工作或开始编写有效的替换反向函数.

Jon*_*eet 5

问题是你正在捕获循环变量.你的所有代表都在捕获相同的变量,所以他们总会在你的用例中看到...的最新值,a这将是values.Length + 1你执行代理的时间.你可以简单地复制它:

for (int a = 0; a < values.Length; a++)
{
    int copy = a;
    yield return () => Values[copy];
}
Run Code Online (Sandbox Code Playgroud)

或者(最好是IMO)使用foreach循环,目前需要相同的解决方法:

foreach (int value in values)
{
    int copy = value;
    yield return () => copy;
}
Run Code Online (Sandbox Code Playgroud)

或者更好的是:

return values.Select(x => (Func<int>)(() => x));
Run Code Online (Sandbox Code Playgroud)

要么:

Func<int, Func<int>> projection = x => () => x;
return values.Select(projection);
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅Eric Lippert的博文"关闭循环变量被视为有害".请注意,foreachC#4.5 的行为可能会发生变化.