検索 K
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
4Reduceはすべての要素を処理して、一値の結果を作りたいときに使えます。 たとえば、すべての要素を足したい場合
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結果の型は入力要素の型と異なる場合を追記
