我在发布问题和答案之间留出了一些时间,给任何想试试这个的人一个机会,但现在我会给你我的答案:
public static IEnumerable<IGrouping<TResultKey, TResultElement>> GroupSelectMany<TOuterKey, TInnerKey, TSourceElement, TResultKey, TResultElement>(
this IEnumerable<IGrouping<TOuterKey, IGrouping<TInnerKey, TSourceElement>>> source,
Func<IGrouping<TOuterKey, IGrouping<TInnerKey, TSourceElement>>, TResultKey> keySelector,
Func<TOuterKey, TInnerKey, TSourceElement, TResultElement> elementSelector)
{
elementSelector = elementSelector ?? ((outerKey, innerKey, element) => (TResultElement)(object)element);
return source.SelectMany(
gg => new IGrouping<TResultKey, TResultElement>[]
{
new Grouping<TResultKey, TResultElement>(
keySelector(gg),
gg.SelectMany(
g => g.Select(
o => elementSelector(gg.Key, g.Key, o))))
});
}
你还需要一个IGrouping的实现,我已经找到了
here
,但我只包括
private
出于封装目的:
private class Grouping<TKey, TElement> : List<TElement>, IGrouping<TKey, TElement>
{
public Grouping(TKey key) : base() => Key = key;
public Grouping(TKey key, int capacity) : base(capacity) => Key = key;
public Grouping(TKey key, IEnumerable<TElement> collection)
: base(collection) => Key = key;
public TKey Key { get; }
}