Использует ли оператор LINQ Join операции с вложенными циклами, объединениями или HashSet? - PullRequest
6 голосов
/ 13 октября 2009

Кто-нибудь знает, что алгоритм Join выполняет LINQ с оператором Join.

Это NestedLoop, Merge или HashSet? Есть ли способ указать другой, если поддерживается?

С уважением Альберт

1 Ответ

9 голосов
/ 13 октября 2009

Сначала он эффективно создает поиск из «внутренней» последовательности, затем перебирает внешнюю последовательность. Затем он может искать каждый ключ из внешней последовательности и выводить каждую подходящую пару. Примерно так (игнорирование проверки аргументов и т. Д.):

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

При поиске для ключей будет использоваться внутренняя хеш-таблица, так что эффективно искать любой отдельный ключ.

...