我是代表新手(也是英文)。
这是我的示例代码:
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
答案 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();
}
}
}