れんしゅう

public void Test()
{
	List<int> list1 = new List<int>{ 1, 2, 3, 4, 5 };
	List<int> list2 = new List<int>{ 1, 10, 100, 1000, 10000 };
	MapCar(
		( v1, v2 ) => (v1 * v2).ToString(),
		list1,
		list2 );

	MapCar(
		( v1, v2 ) => {
			string result = "";
			for ( int i=0 ; i<v1 ; i++ )
				result += v2.ToString();
			return result;
		},
		list1,
		list2 );
}

// mapcarもどき
private void MapCar( Func<int, int, string> func, List<int> list1, List<int> list2 )
{
	if ( list1.Count != list2.Count ) return;

	for ( int i=0 ; i<list1.Count ; i++ )
	{
		Console.WriteLine( func( list1[ i ], list2[ i ] ) );
	}
}


( v1, v2 ) => (v1 * v2).ToString()と書くより、
( ( v1, v2 ) => (v1 * v2).ToString() )と書いたほうが個人的には好みかもしれない。


2回目のMapCarは、ブロックを使っています。
これは、2006-MayCTPコンパイラでは出来なかった技です。(仕様書にはあったけど実装されてなかった)
ただ、return と書くまで型推論が行われないので青いの(?)が出てきてちょっとうざい。