You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
47 lines
2.1 KiB
47 lines
2.1 KiB
5 years ago
|
#if NET20 || NET30 || !NET_4_6
|
||
|
|
||
|
using System.Collections.Generic;
|
||
|
|
||
|
namespace System.Linq.Reimplement
|
||
|
{
|
||
|
public static partial class Enumerable
|
||
|
{
|
||
|
public static IEnumerable<TResult> GroupJoin<TOuter, TInner, TKey, TResult>(this IEnumerable<TOuter> outer, IEnumerable<TInner> inner, Func<TOuter, TKey> outerKeySelector, Func<TInner, TKey> innerKeySelector, Func<TOuter, IEnumerable<TInner>, TResult> resultSelector)
|
||
|
{
|
||
|
return GroupJoin(outer, inner, outerKeySelector, innerKeySelector, resultSelector, null);
|
||
|
}
|
||
|
|
||
|
public static IEnumerable<TResult> GroupJoin<TOuter, TInner, TKey, TResult>(this IEnumerable<TOuter> outer, IEnumerable<TInner> inner, Func<TOuter, TKey> outerKeySelector, Func<TInner, TKey> innerKeySelector, Func<TOuter, IEnumerable<TInner>, TResult> resultSelector, IEqualityComparer<TKey> comparer)
|
||
|
{
|
||
|
LinqCheck.JoinSelectors(outer, inner, outerKeySelector, innerKeySelector, resultSelector);
|
||
|
|
||
|
if (comparer == null)
|
||
|
{
|
||
|
comparer = EqualityComparer<TKey>.Default;
|
||
|
}
|
||
|
|
||
|
return CreateGroupJoinIterator(outer, inner, outerKeySelector, innerKeySelector, resultSelector, comparer);
|
||
|
}
|
||
|
|
||
|
private static IEnumerable<TResult> CreateGroupJoinIterator<TOuter, TInner, TKey, TResult>(this IEnumerable<TOuter> outer, IEnumerable<TInner> inner, Func<TOuter, TKey> outerKeySelector, Func<TInner, TKey> innerKeySelector, Func<TOuter, IEnumerable<TInner>, TResult> resultSelector, IEqualityComparer<TKey> comparer)
|
||
|
{
|
||
|
// NOTICE this method has no null check
|
||
|
var innerKeys = ToLookup(inner, innerKeySelector, comparer);
|
||
|
|
||
|
foreach (var element in outer)
|
||
|
{
|
||
|
var outerKey = outerKeySelector(element);
|
||
|
if (!ReferenceEquals(outerKey, null) && innerKeys.Contains(outerKey))
|
||
|
{
|
||
|
yield return resultSelector(element, innerKeys[outerKey]);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
yield return resultSelector(element, Empty<TInner>());
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#endif
|