3

LINQ ステートメントをチェーンすると、複数の反復が発生しますか?

たとえば、where 句を使用してデータをフィルター処理し、一致に対して合計を実行するとします。

int total = data.Where(item => item.Alpha == 1 && item.Beta == 2)
    .Sum(item => item.Qty);

これは、これと同等になるように、データの単一の反復になりますか?

int total = 0;
foreach (var item in data)
    if (item.Alpha == 1 && item.Beta == 2)
        total += 1;

それとも、1 回反復し、2 回目dataの結果をwhere合計しますか?

4

2 に答える 2

5

LINQ のステートメントはストリーミングされるため、がその値を列挙するWhereまで実際には実行されません。Sumこれは、 からの項目dataが効果的に一度に列挙されることを意味します。

基本的に、このWhereメソッドは新しい を作成しますが、IEnumerable<T>実際には を列挙しませんdataSumは、 fromforeachをオーバー処理します。これにより、シーケンス内のアイテムが一度に 1 つずつプルされます。IEnumerable<T>WhereWhere

于 2013-08-23T17:05:47.123 に答える
4

はい、その LINQ クエリでは、ソース コレクションに対して 1 回だけ反復が行われます。

使い方?一度に 1 つの要素をSum 要求Whereし、 (ソース コレクション上で) 要求します。そのため、Sum次の要素が必要な場合は、次のように実装されているからをMoveNext呼び出しEnumerator<T>ます。Where

foreach(var item in source)
    if(predicate(item))
        yield return item;

さらに理解するには、反復子について読む必要があります:反復子 (C# および Visual Basic)

于 2013-08-23T17:08:08.860 に答える