.NETでのマップと削減


回答:


298

MapとReduceに相当するLinq:運が良ければlinqを使用できるので、独自のマップを作成して関数を削減する必要はありません。C#3.5とLinqは、異なる名前ではありますが、すでにそれを持っています。

  • 地図はSelect

    Enumerable.Range(1, 10).Select(x => x + 2);
  • 削減はAggregate

    Enumerable.Range(1, 10).Aggregate(0, (acc, x) => acc + x);
  • フィルターはWhere

    Enumerable.Range(1, 10).Where(x => x % 2 == 0);

https://www.justinshield.com/2011/06/mapreduce-in-c/


1
翻訳は正しいですが、重要なポイントを逃しています。map reduceのシャッフル手順はmap-reduceでは重要ですが、コードを記述する必要のない名前には表示されません。これは、マップステップで抽出されるキーによってのみ駆動されます。ジョエル・マルティネスの回答は、私の意見ではそれをよりよく強調しています。
xtofs

2
リンクが機能していない、正しいリンクは次のとおり
Alexandru-Dan Pop

12
なぜ、オハイオ州なぜ彼らはそれを呼び出すことはありませんReduceのではなく、AggregateMSはちょうど困らプログラマに好き...
ジョン・ヘンケル

13
@JohnHenckel、私は間違いなく権威あるソースではありませんが、これはSQLからのものであると確信しています。linqは、C#でのSQLとのやり取りを簡単にする方法として最初に購入されたと思います。その世界で関数に名前を付けると、集約は、「選択」や「グループ化」などと比較すると、「削減」よりも少し親しみやすいように聞こえます。私はそれが正しいと言っているわけではありません、それは私に終わりを許さないが、それがその理由だと思います。
Elliot Blackburn

18

mapreduceスタイルのソリューションに適した問題のクラスは、集約の問題です。データセットからデータを抽出すること。C#では、LINQを利用してこのスタイルでプログラミングできます。

次の記事から:http : //codecube.net/2009/02/mapreduce-in-c-using-linq/

GroupByメソッドはマップとして機能し、Selectメソッドは中間結果を最終的な結果リストに削減します。

var wordOccurrences = words
                .GroupBy(w => w)
                .Select(intermediate => new
                {
                    Word = intermediate.Key,
                    Frequency = intermediate.Sum(w => 1)
                })
                .Where(w => w.Frequency > 10)
                .OrderBy(w => w.Frequency);

分散部分については、DryadLINQをチェックアウトできます:http ://research.microsoft.com/en-us/projects/dryadlinq/default.aspx


3

私はLINQはそれを呼び出す覚えていないことができないのでWhereSelectAggregateの代わりにFilterMapReduce私はいくつかの拡張メソッドを作成しましたので、あなたが使用することができます。

IEnumerable<string> myStrings = new List<string>() { "1", "2", "3", "4", "5" };
IEnumerable<int> convertedToInts = myStrings.Map(s => int.Parse(s));
IEnumerable<int> filteredInts = convertedToInts.Filter(i => i <= 3); // Keep 1,2,3
int sumOfAllInts = filteredInts.Reduce((sum, i) => sum + i); // Sum up all ints
Assert.Equal(6, sumOfAllInts); // 1+2+3 is 6

以下は3つのメソッドです(https://github.com/cs-util-com/cscore/blob/master/CsCore/PlainNetClassLib/src/Plugins/CsCore/com/csutil/collections/IEnumerableExtensions.csから):

public static IEnumerable<R> Map<T, R>(this IEnumerable<T> self, Func<T, R> selector) {
    return self.Select(selector);
}

public static T Reduce<T>(this IEnumerable<T> self, Func<T, T, T> func) {
    return self.Aggregate(func);
}

public static IEnumerable<T> Filter<T>(this IEnumerable<T> self, Func<T, bool> predicate) {
    return self.Where(predicate);
}

https://github.com/cs-util-com/cscore#ienumerable-extensionsの詳細:

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.