2009-10-13 8 views

答えて

9

まずそれが効果的に外側の列を反復処理、その後、「内側」シーケンスからのルックアップを作成します。次に、外部シーケンスから各キーを検索し、それぞれの適切なペアを生成することができます。

public static IEnumerable<TResult> Join<TOuter, TInner, TKey, TResult> 
    (this IEnumerable<TOuter> outer, 
    IEnumerable<TInner> inner, 
    Func<TOuter, TKey> outerKeySelector, 
    Func<TInner, TKey> innerKeySelector, 
    Func<TOuter, TInner, TResult> resultSelector) 
{ 
    Lookup<TKey, TInner> lookup = inner.ToLookup(innerKeySelector); 
    foreach (TOuter outerItem in outer) 
    { 
     TKey key = outerKeySelector(outerItem); 
     foreach (TInner innerItem in lookup[key]) 
     { 
      yield return resultSelector(outerItem, innerItem); 
     } 
    } 
} 

それは個々のキーをルックアップするために効率的だように、ルックアップは、キーの内部ハッシュテーブルを使用します。この(引数の検証を無視するなど)のようなもの。