0

这有效:

    //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);
                }
            }
        );

是否可以使用 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);
    }
}

我正在尝试看看它是否可以完成。

4

2 回答 2

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

(我将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));

我认为第二个示例更接近您想要实现的目标。

正如@lee 指出的那样,ref至少在您显示的代码中,不需要该参数。 ref参数也不能在 lambdas 中使用,导致编译器错误,所以我将其删除。如果您确实需要使用ref,请使用第一个示例。

您不能使用的原因Func是因为 aFunc<T>是返回T值的东西,并且Parallel正在寻找Action<T>返回 void 的 。

@dtb 指出了一些非常重要的事情:“请注意,从多个线程并行添加到列表中不是线程安全的。” 您可以通过在您的list.Add方法周围加一个锁来解决这个问题,锁定到private static object. 我猜你的大部分工作都是在计算IsPanDigital,所以我认为这是有道理的。

于 2012-06-27T19:43:23.777 回答
1

我不知道你想用它做什么,但你的功能帽子是

  • 静止的
  • 无效名称(int i)

这是一些编译的代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {

        static List<long> list = new List<long>();

        static void Main(string[] args)
        {


            //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);
                }
            });

            Parallel.For(1023456789, 1033456789, Blah); //other overloads do accept other Actions

        }

        private static bool IsPanDigital(long i)
        {
            return false;
        }

        public static void Blah(int i) // = Action<int i>
        {
            if (i % 10000000 == 0) Console.WriteLine("{0:N0}", i);
            if (IsPanDigital(i))
            {
                list.Add(i);
            }
        }
    }
}
于 2012-06-27T19:54:05.940 回答