将代理写为Func

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)

我试图看看它是否可以完成.

Tim*_* S. 7

你几乎拥有它:

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>)

编辑:或更改BlahAction<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,所以我认为这是有道理的.