2009-10-13 4 views

Antwort

9

Zuerst schafft effektiv eine Suche von der „inneren“ Sequenz wiederholt sich dann durch die äußere Folge. Es kann dann jeden Schlüssel aus der äußeren Sequenz nachschlagen und jedes geeignete Paar ergeben. So etwas wie diese (ohne Berücksichtigung Argument Validierung etc.):

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); 
     } 
    } 
} 

Die Lookup wird eine Hash-Tabelle intern für die Schlüssel verwenden, so dass es effizienter ist jeden einzelnen Schlüssel zu suchen.