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
#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 |