コンテンツへスキップ

C#でMapReduce

C#でdelegateとtempleteを使ってMap-Reduceを作ってみた。

public class CollectionUtilities
{
	public delegate T MapFunction(T aElement);
	public static void Map(IList aList, MapFunction aFunction)
	{
		for (int i = 0; i < aList.Count; i++)
		{
			aList[i] = aFunction(aList[i]);
		}
	}

	public delegate S ReduceFunction(S aSummary, E aElement);
	public static S Reduce(IEnumerable aEnumerable, S aInitialValue, ReduceFunction aFunction)
	{
		S tSummary = aInitialValue;
		foreach (E tElement in aEnumerable)
		{
			tSummary = aFunction(tSummary, tElement);
		}
		return tSummary;
	}
}

Mapはすべての要素に対して何か処理を行いたいときに使えます。 たとえば、すべての要素を+1したい場合

int[] aData = new int[] { 1, 2, 3 };

// 足してみる
CollectionUtilities.Map(aData, delegate(int aElement)
{
	return aElement + 1;
});

// 表示はこんな感じで
CollectionUtilities.Map(aData, delegate(int aElement)
{
	System.Console.WriteLine(aElement); return aElement;
});

結果

2
3
4

Reduceはすべての要素を処理して、一値の結果を作りたいときに使えます。 たとえば、すべての要素を足したい場合

System.Console.WriteLine(CollectionUtilities.Reduce(new int[] { 1, 2, 3 }, 0, delegate(int aSummary, int aElement)
{
	return aSummary + aElement;
}));

結果

6

結果の型は入力要素の型と異なっていてもかまいません。 たとえば、すべての要素を文字列連結したい場合

System.Console.WriteLine(CollectionUtilities.Reduce(new int[] { 1, 2, 3 }, "@", delegate(string aSummary, int aElement)
{
	return aSummary + aElement;
}));

結果

@123

組み合わせて使うと、なんか嬉しいらしい。MapReduce

2009/06/15結果の型は入力要素の型と異なる場合を追記

© 2003 Kurusugawa Computer Inc.