C#Action,Func,可以嵌套还是链接?

时间:2017-09-18 05:19:35

标签: delegates action func

我是代表新手(也是英文)。

这是我的示例代码:

var expected_for = new int[Length];

Func<int[], Action<int>> opFactory = res => i => res[i] = arg1[i] + arg2[i];

Parallel.For(0, arg1.Length, opFactory(expected)); // working well

Enumerable.Range(0, arg1.Length).ToList().ForEach(opFactory(expected_foreach));  // working well

         for (int i = 0; i < arg1.Length; i++)
            {
                opFactory(expected_for); //No Error, but expected_for is not changed
            }

Q1。 Func<int[], Action<int>> opFactory = res => i => res[i] = arg1[i] + arg2[i];    在Func中,Action可以嵌套吗?这对我来说太难理解了。

Q2。 Parallel.For的第三个参数需要Action。那么我的Func行是Action

Q3。如何在for()中节省价值?

感谢您阅读

此致

ICE

1 个答案:

答案 0 :(得分:1)

代表们比你想象的要简单 让我们来看看Func。最后一个参数是必须返回的结果 因此,您需要指定至少一个通用参数
对于examaple Func<int,string>,可以指出接受int并返回字符串的任何方法 在下面的例子中,所有4个函数都做同样的事情。

Q1:您可以根据需要将它们变得复杂 Q2:No Action与Func不同。它有效,因为它是一个接受Func的重载 问题3:它没有工作,因为没有(i)你实际上没有调用该方法。你调用了opFactory并忽略了它的结果

using System;
namespace ConsoleApp1
{

    class Program
    {
        static void Main(string[] args)
        {
            ///lamda statement
            Func<int, string> func4 = i => { return i.ToString(); };

            ///lamda expression (if there is only 1 statement)
            Func<int, string> func3 = i => i.ToString();

            Func<int, string> func2 = delegate (int i) { return i.ToString(); };

            //Just point to an existing method
            Func<int, string> func1 = ToString;
        }

        static string ToString(int arg)
        {
            return arg.ToString();
        }
    }
}

一个完整的例子

using System;
using System.Linq;
using System.Threading.Tasks;
namespace ConsoleApp1
{

    class Program
    {
        static void Main(string[] args)
        {
            int Length = 5;

            var arg1 = Enumerable.Range(10, Length).ToArray();
            var arg2 = Enumerable.Range(100, Length).ToArray();

            var expected = new int[Length];
            var expected_for = new int[Length];
            var expected_foreach = new int[Length];

            Func<int[], Action<int>> opFactory = res => i => res[i] = arg1[i] + arg2[i];

            Parallel.For(0, arg1.Length, opFactory(expected));

            Enumerable.Range(0, arg1.Length).ToList().ForEach(opFactory(expected_foreach));

            for (int i = 0; i < arg1.Length; i++)
            {
                opFactory(expected_for)(i);
            }

            //all 3 tables have the same data 110,112,114,116,118
            Console.ReadLine();
        }
    }
}