我可以使用Method而不是Lambda表达式和额外的参数

Jos*_*a C 5 .net c# vb.net

我有一个内联lambda表达式,我想在整个应用程序中使用它.我似乎无法找到关于如何使用更多参数执行此操作的参考,而不是正在测试的元素.这是我目前拥有的一个简单示例.

Private Sub Test()
    Dim List As New List(Of String) From {"Joe", "Ken", "Bob", "John"}
    Dim Search As String = "*Jo*"
    Dim Result = List.Where(Function(Name) Name Like Search)
End Sub
Run Code Online (Sandbox Code Playgroud)

我知道IEnumerable.Where接受一个方法,其中元素类型作为参数和返回的布尔值.

Private Sub Test()
    Dim List As New List(Of String) From {"Joe", "Ken", "Bob", "John"}
    Dim Search As String = "*Jo*"
    Dim Result = List.Where(AddressOf FindName)
End Sub

Private Function FindName(Name As String) As Boolean
    Return Name Like "*Jo*"
End Function
Run Code Online (Sandbox Code Playgroud)

我想将Search变量传递给FindName.我似乎无法得到语法完成这一点.我提出的唯一可行解决方案是将所有内容传递给函数以执行原始语句.

Private Sub Test()
    Dim List As New List(Of String) From {"Joe", "Ken", "Bob", "John"}
    Dim Search As String = "*Jo*"
    Dim Result = FindName(List, Search)
End Sub

Private Function FindName(List As IEnumerable(Of String), Search As String) As IEnumerable(Of String)
    Return List.Where(Function(Name) Name Like Search)
End Function
Run Code Online (Sandbox Code Playgroud)

不觉得有必要在VB中回答.

Str*_*ior 6

lambda表达式的优点在于它们允许闭包自动捕获作用域本地的变量.例如(原谅C#):

List.Where(i => FindName(i, Search));
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,Search变量实际上被封装在一个闭包中.如果您只想传递一个方法,则必须模拟闭包对实际类结构的作用:

public class NameFinder
{
    private string _search;
    public NameFinder(string search) {
        _search = search;
    }
    public bool Match(string item) {
        // C# equivalent of "return item LIKE _search"
    }
}

// Usage
var nameFinder = new NameFinder(Search);
List.Where(nameFinder.Match);
Run Code Online (Sandbox Code Playgroud)

但是,此策略仅适用于一小部分案例.我发现通常最好只使用一个lambda表达式,将适当的变量传递给完成所有工作的函数.