我有以下代码:
List<Person> People = new List<Person>();
List<PersonType> PeopleTypes = new List<PersonType>();
var JoinedLists = People.Join(PeopleTypes, PeopleKey => PeopleKey.PersonType, PeopleTypesKey => PeopleTypesKey.TypeID, (Person, PersonType) => new { Name = Person.Name, TypeID = PersonType.TypeID });
现在我想为此代码创建一个方法,使其可以重用。到目前为止,我已经达成了这个目标:
List<T> ListJoin<T, S>(List<T> FirstTable, List<T> SecondTable, Func<T, S> OuterKeySelectorExpr, Func<T, S> InnerKeySelectorExpr, _______ ResultSelectorExpr)
{
FirstTable.Join(SecondTable, OuterKeySelectorExpr, InnerKeySelectorExpr, ResultSelectorExpr);
}
我做得对吗?什么是等效的Func&lt;&gt;委托加入扩展的结果选择器?
答案 0 :(得分:1)
您无法使用匿名类型执行此操作。你真正要求的是:
Func<T, S, WeirdAnonymousTypeHere>
但匿名类型是无名称类型,因此new { Name = Person.Name, TypeID = PersonType.TypeID }
的类型没有名称且无法指定。
但是,有时可以根据用法推断出类型,因此您可以为方法提供第三个通用参数:
ListJoin<T, S, R>
其中R
(因此也T
和S
)应该在调用方法时根据用法推断,然后方法的最后一个参数将是
Func<T, S, R> resultSelector
当然。
所以完整的签名将是:
static List<R> ListJoin<T, S, R>(List<T> firstTable, List<T> secondTable,
Func<T, S> outerKeySelector, Func<T, S> innerKeySelector,
Func<T, S, R> resultSelector)
或类似的东西。
与Linq-To-Object的Join
方法(see documentation)的签名进行比较:
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)