【问题标题】:Func Delegate Equivalent for System.Linq.Join Parameters等效于 System.Linq.Join 参数的 Func 委托
【发布时间】:2014-03-05 09:05:13
【问题描述】:

我有以下代码:

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 委托是什么?

【问题讨论】:

  • ListJoin 与普通的join 有何不同?
  • 嗯,我打算在join下面添加更多代码。

标签: c# linq lambda delegates func


【解决方案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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多