【问题标题】:Passing func from method parameter into a LINQ method (generic types)将 func 从方法参数传递到 LINQ 方法(泛型)
【发布时间】:2009-10-02 12:23:29
【问题描述】:

在方法的签名中,我指定了一个 Func,如下所示:

public void Method (Func<string, bool> func)

在 LINQ 中,哪种方法(来自 IEnumerable)可以让我将方法参数中的 Func 传递给 LINQ 查询?另一个问题是,我的 func 可以有任何类型参数,因此来自 IEnumerable/LINQ 的方法必须支持泛型类型占位符。

我想写这样的东西:

// Get all elements of type T from the webpage (find is an object in an external API to look for elements in a page).

IEnumerable<T> images = find.GetAllByTagName<T>().All(func);

// Where func is a method parameter which is assigned at run time by the consumer of this API:

public void Test (Func<T, bool> func) { }

我怎样才能最好地做到这一点?我在 .NET 3.5 上

谢谢

【问题讨论】:

  • 你知道 .All() 的返回类型是布尔值,而不是 IEnumerable,对吧?你可能想要 .Where() 代替。

标签: c# linq generics


【解决方案1】:

在 LINQ 中,哪种方法(来自 IEnumerable)可以让我将方法参数中的 Func 传递给 LINQ 查询?

LinqToObjects 的扩展方法挂在静态 System.Linq.Enumerable 类上。


鉴于您的 Func 签名,您可能希望 this 重载 Enumerable.Where

IEnumerable&lt;T&gt; Enumerable.Where&lt;T&gt;(this IEnumerable&lt;T&gt; source, Func&lt;T, bool&gt; filter)

【讨论】:

  • 是的。我看到了哪里,但没有注意到过载(我不需要 int)。这就是我一开始遇到问题的原因。
【解决方案2】:

将您的 API 签名更改为开放:

public void Method<T> (Predicate<T> func)

您的消费者将使用类型 T 关闭通用签名,并提供适当的谓词。

使用 LINQ 的实际方法实现将使用 Joel 前面提到的 Where()

编辑:将func改为谓词

其他编辑:

我会亲自返回一个 IEnumerable,表示您的结果集受传入的谓词约束:

public IEnumerable Method<T> (Predicate<T> func)
{
    return find.Where(func)
}

我正在对您尝试做的事情做出一些假设,如果这是您的意图,请告诉我。

【讨论】:

  • Predicate 不适合 Where 子句,Predicate 和 Func 之间没有转换。但是,您可以将 thePredicate.Invoke 放在 Where 子句中。它将被转换为 Func.
  • 有趣,谢谢犹大。我认为这是一个安全的假设,它可以作为隐式强制转换。
【解决方案3】:

在 LINQ 中,哪种方法(来自 IEnumerable) 会让我传入一个 函数从方法参数到 LINQ 查询?

这个问题对我来说有点模糊。如果您正在寻找仅返回 Func 指定的匹配项的过滤算法,请使用 .Where 方法:

public void Method (Func<string, bool> func)
{
    return find.GetAllByTagName<T>().Where(func);
}

这是否回答了您的问题?如果不是,请说明您要做什么。

【讨论】:

  • 我会在我的工作机器上尝试一下。我想我是因为外部压力而匆忙编写代码(除了我的错误)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多