System.Linq.Join参数的Func Delegate等效项

时间:2014-03-05 09:05:13

标签: c# linq lambda delegates func

我有以下代码:

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;委托加入扩展的结果选择器?

1 个答案:

答案 0 :(得分:1)

您无法使用匿名类型执行此操作。你真正要求的是:

Func<T, S, WeirdAnonymousTypeHere>

但匿名类型是无名称类型,因此new { Name = Person.Name, TypeID = PersonType.TypeID }的类型没有名称且无法指定。

但是,有时可以根据用法推断出类型,因此您可以为方法提供第三个通用参数:

ListJoin<T, S, R>

其中R(因此也TS)应该在调用方法时根据用法推断,然后方法的最后一个参数将是

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)