Dav*_*eer 0 c# lambda delegates
这工作:
//delegate
Parallel.For(1023456789, 1033456789, delegate(long i)
{
if (i % 10000000 == 0) Console.WriteLine("{0:N0}", i);
if (IsPanDigital(i))
{
list.Add(i);
}
}
);
//lambda expression
Parallel.For(1023456789, 1033456789, i =>
{
if (i%10000000 == 0) Console.WriteLine("{0:N0}", i);
if (IsPanDigital(i))
{
list.Add(i);
}
}
);
Run Code Online (Sandbox Code Playgroud)
是否可以使用Func重写此逻辑?我在这里试过..不编译.
var list = new List<long>();
Parallel.For(1023456789, 1033456789, Blah(i, ref list));
public static Func<long> Blah(long i, ref List<long> list)
{
if (i % 10000000 == 0) Console.WriteLine("{0:N0}", i);
if (IsPanDigital(i))
{
list.Add(i);
}
}
Run Code Online (Sandbox Code Playgroud)
我试图看看它是否可以完成.
你几乎拥有它:
public static void Blah(long i, ref List<long> list)
{
if (i % 10000000 == 0) Console.WriteLine("{0:N0}", i);
if (IsPanDigital(i))
{
list.Add(i);
}
}
var list = new List<long>();
Parallel.For(1023456789, 1033456789, i => Blah(i, ref list));
Run Code Online (Sandbox Code Playgroud)
(我将Blah返回类型更改为void,并添加i =>以将其包装在lambda中以便它可以匹配Action<long>)
编辑:或更改Blah到Action<long>,做一些小的重构:
public static Action<long> Blah(List<long> list)
{
return i =>
{
if (i % 10000000 == 0) Console.WriteLine("{0:N0}", i);
if (IsPanDigital(i))
{
list.Add(i);
}
};
}
var list = new List<long>();
Parallel.For(1023456789, 1033456789, Blah(list));
Run Code Online (Sandbox Code Playgroud)
我认为这第二个例子更接近你想要实现的目标.
正如@lee指出的那样,ref参数,至少在您显示的代码中是不需要的. ref参数也不能在lambdas中使用,这会导致编译错误,所以我删除了它.如果你真的需要使用ref,请转到第一个例子.
你不能使用的原因Func是因为a Func<T>是返回T值的东西,并且Parallel正在寻找Action<T>返回void的东西.
@dtb指出了一些非常重要的东西:"请注意,并行添加到多个线程的列表不是线程安全的." 您可以通过锁定list.Add方法,锁定到a 来解决此问题private static object.我猜你的绝大部分工作都在计算中IsPanDigital,所以我认为这是有道理的.
| 归档时间: |
|
| 查看次数: |
102 次 |
| 最近记录: |