3

私は、インターネット上のここや他の場所で詳細に説明されていることを知っているので、誰かがAggregateの機能を説明しなくても、正確な質問に答えるためにこれを表現する最良の方法を考えようとしています。Aggregate()を呼び出し、次のようなlinqステートメントを使用する場合

(a,b) => a+b

aとは何ですか?bとは何ですか?aが現在の要素であることは知っていますが、bとは何ですか?bが単にaの1つ前の要素であるように見える例や、aが前の関数の結果であるように見える他の例、およびbが前の関数の結果であるように見える他の例を見てきました。

ここhttp://msdn.microsoft.com/en-us/library/bb548744.aspx およびここ http://www.dotnetperls.com/aggregateの実際のC#ドキュメントページの例を 確認しました。

しかし、linq式の2つの引数の違いを明確にする必要があります。これに答える基本的なLinqの知識が不足している場合は、遠慮なく私の代わりに配置してください。

4

3 に答える 3

5

http://msdn.microsoft.com/en-us/library/bb548651.aspxの例を見てください。

        string sentence = "the quick brown fox jumps over the lazy dog";

        // Split the string into individual words. 
        string[] words = sentence.Split(' ');

        // Prepend each word to the beginning of the  
        // new sentence to reverse the word order. 
        string reversed = words.Aggregate((workingSentence, next) =>
                                              next + " " + workingSentence);

        Console.WriteLine(reversed);

        // This code produces the following output: 
        // 
        // dog lazy the over jumps fox brown quick the 

この例では、渡される無名関数Aggregateは です(workingSentence, next) => next + " " + workingSentence。 現在の要素までの集計の結果が含まれ、a現在の要素が集計に追加されます。無名関数の最初の呼び出しでは、. 次の呼び出しでは、および.workingSentencebworkingSentence = ""next = "the"workingSentence = "the"next = "quick"

于 2013-03-13T18:59:51.367 に答える
4

その説明に一致する Func を取るオーバーロードを呼び出す場合は、次のバージョンを使用している可能性が最も高いです。

Enumerable.Aggregate

つまり、それaがアキュムレータにbなり、次に使用する要素になります。

someEnumerable.Aggregate((a,b) => a & b);

これを通常のループに展開すると、次のようになります。

Sometype a = null;

foreach(var b in someEnumerable)
{
    if(a == null)
    {
        a = b;
    }
    else
    {
        a = a & b;
    }
}

ビット単位の AND を実行し、結果をアキュムレータに格納します。

于 2013-03-13T18:57:15.680 に答える
3

aは現在の要素ではありません -bです。ラムダ式が初めて呼び出されたときは、 に指定した引数aと等しくなります。その後は毎回、ラムダ式の前回の呼び出しの結果と等しくなります。seedAggregate

于 2013-03-13T18:58:34.493 に答える