Согласно eduLINQ :
Лучший способ справиться с тем, что делает GroupJoin, - это думать о Join. Там общая идея заключалась в том, что мы просмотрели «внешнюю» входную последовательность, нашли все соответствующие элементы из «внутренней» последовательности (основанные на ключевой проекции на каждую последовательность), а затем дали пары совпадающих элементов. GroupJoin аналогичен, за исключением того, что вместо получения пар элементов он дает единственный результат для каждого «внешнего» элемента на основе этого элемента и последовательности совпадающих «внутренних» элементов.
blockquote>только разница в операторе return:
Присоединиться:
var lookup = inner.ToLookup(innerKeySelector, comparer); foreach (var outerElement in outer) { var key = outerKeySelector(outerElement); foreach (var innerElement in lookup[key]) { yield return resultSelector(outerElement, innerElement); } }
GroupJoin:
var lookup = inner.ToLookup(innerKeySelector, comparer); foreach (var outerElement in outer) { var key = outerKeySelector(outerElement); yield return resultSelector(outerElement, lookup[key]); }
Подробнее здесь: