c# - 从 LINQ 中提取 lambda 表达式

标签 c# lambda hyperlink refactoring

我有下一段代码

var query = wordCollection.Select((word) => { return word.ToUpper(); })
                          .Where((word) =>
                                  {
                                      return String.IsNullOrEmpty(word);
                                  })
                          .ToList();

假设我想重构这段代码并从 Where 子句中提取 lambda 表达式。在 Visual Studio 中,我只选择这个 lambda 并执行 Refactor -> Extract Method。通过这样做,我将 LINQ 修改为

 var query = wordCollection.Select((word) => { return word.ToUpper(); })
                          .Where(NewMethod1())
                          .ToList();

并且 NewMethod1() 被声明为

  private static Func<string, bool> NewMethod1()
  {
      return (word) =>
      {
          return String.IsNullOrEmpty(word);
      };
  }

问题是为什么这个新方法没有任何输入参数,因为委托(delegate) Func 声明 NewMethod1() 应该有一个字符串输入参数?

最佳答案

要获得预期的结果,只需标记这部分 String.IsNullOrEmpty(word) 并提取方法:

private bool NewMethod(string word)
{
    return String.IsNullOrEmpty(word);
}  

您最初得到的是因为提取创建了一个返回委托(delegate)的方法。不是与委托(delegate)匹配的方法。它是一个返回另一个方法的方法。后者接受一个字符串参数 word 并返回一个 bool 结果。

确保执行上述操作会将您的代码更改为:

.Where((word) => NewMethod(word))

但您可以安全地将其更改为:

.Where(NewMethod)

旁注:

无需在 Linq 查询或任何单行 lambda 中使用 return 关键字,您可以将查询重构为如下所示:

var query = wordCollection.Select(word => word.ToUpper())
                          .Where(word => string.IsNullOrEmpty(word))
                          .ToList();

关于c# - 从 LINQ 中提取 lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38826047/

相关文章:

HTML5 : hyperlink and new tab

lambda - 什么是 lambda 以及什么是示例实现?

c# - OrderBy Lambda 的通用列表

c# - 如何检查 XPath 中的多个属性?

c# - 有没有办法输入数字而不立即显示它们?

Python opencv 排序轮廓

php - 在 PHP 中创建链接

html - css 幻灯片中的链接

c# - 如何在不创建它的对象的情况下调用父类方法

c# - 如何通过反射获取 C# 属性名称作为字符串?