gpt4 book ai didi

c# - 我可以使用方法代替带有额外参数的 Lambda 表达式吗

转载 作者:太空狗 更新时间:2023-10-29 23:09:59 26 4
gpt4 key购买 nike

我有一个内联 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

我知道 IEnumerable.Where 接受一个以元素类型作为参数和返回 bool 值的方法。

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

我也想将 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

不要觉得有义务用 VB 回答。

最佳答案

lambda 表达式的好处在于它们允许闭包 自动捕获范围内的本地变量。例如(请原谅 C#):

List.Where(i => FindName(i, Search));

在上面的代码中,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);

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

关于c# - 我可以使用方法代替带有额外参数的 Lambda 表达式吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9036534/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com