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

この 2 番目の例は、あなたが達成しようとしていたことに近いと思います。

@leeが指摘したように、ref少なくともあなたが示したコードでは、パラメーターは必要ありません。 refパラメーターもラムダ内で使用できず、コンパイラ エラーが発生したため、削除しました。本当に を使用する必要がある場合refは、最初の例に進んでください。

使用できない理由Funcは、 aが値Func<T>を返すものであり、 void を返す を探しているためです。TParallelAction<T>

@dtb は、非常に重要なことを指摘しました。list.Addメソッドの周りにロックを配置し、 private static object. あなたの仕事の大部分は計算IsPanDigitalにあると思いますので、これは理にかなっていると思います。

于 2012-06-27T19:43:23.777 に答える
1

私はあなたがそれで何をしたいのか分かりませんが、あなたの機能は

  • 静的
  • void name(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 に答える