C#でもやってみる

C#でも同じことをやってみました。

これではだめで、

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

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<int, int, int>[] lams = new Func<int, int, int>[10];

            foreach (var x in Enumerable.Range(0, 10))
            {
                lams[x] = (l, m) => l * x + m;            
            }
            Array.ForEach(lams, (lam) => Console.WriteLine(lam(1, 5)));
        }
    }
}

こっちでは、うまくいきます。

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

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<int, int, int>[] lams = new Func<int, int, int>[10];

            foreach (var x in Enumerable.Range(0, 10))
            {
                int y = x;
                lams[y] = (l, m) => l * y + m;
            }
            Array.ForEach(lams, (lam) => Console.WriteLine(lam(1, 5)));
        }
    }
}

以下、C#3.0ぽい書き方にしてみました。
メソッドチェインで。

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

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var lams2 = Enumerable.Range(0, 10).Select(x => (Func<int, int, int>)((int l, int m) => l * x + m));

            foreach (var item in lams2)
            {
                Console.WriteLine(item(1,5));
            }
        }
    }
}

LINQで。

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

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var lams2 = from x in Enumerable.Range(0, 10)
                        select (Func<int, int, int>)((int l, int m) => l * x + m);

            foreach (var item in lams2)
            {
                Console.WriteLine(item(1,5));
            }
        }
    }
}