从LINQ中提取lambda表达式

3
我有下面这段代码
var query = wordCollection.Select((word) => { return word.ToUpper(); })
                          .Where((word) =>
                                  {
                                      return String.IsNullOrEmpty(word);
                                  })
                          .ToList();

假设我想重构这段代码并从Where子句中提取lambda表达式。在Visual Studio中,我只需选择此lambda,然后执行重构->提取方法。这样一来,我的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);
      };
  }

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

5
因为它创建了一个返回委托的方法,而不是匹配委托的方法。你期望的是一个带有string参数和bool返回类型的方法。 - Zein Makki
它看起来有些奇怪,因为正如上面的人所说,它看起来是一个不应该编译的函数 - 但它返回的是委托,而不是代码的结果,所以,它就是这样。 - BugFinder
2个回答

2
为了获得预期结果,只需标记此部分 String.IsNullOrEmpty(word) 并提取方法:
private bool NewMethod(string word)
{
    return String.IsNullOrEmpty(word);
}  

你最初得到的是因为提取器创建了一个返回委托的方法。而不是匹配委托的方法。它是返回另一个方法的方法。后者接受一个字符串参数“word”并返回一个布尔结果。
对上述更改的确保会改变您的代码。
.Where((word) => NewMethod(word))

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

.Where(NewMethod)

注意事项:

在您的Linq查询或任何一行Lambda中,不需要使用return关键字,您可以重构您的查询如下:

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

使用相同的逻辑,你不能再进一步地将它变成 var query = wordCollection.Select(word => word.ToUpper()).Where(String.IsNullOrEmpty).ToList(); 吗? - Sunny Patel
@SunnyPatel 可以这样写,但我更喜欢发布的那个,因为它更简单明了。 - Zein Makki

0

您选择了整个lambda,因此它正在尝试将整个lambda语句提取为一个委托,该委托接受一个单词并返回一个布尔值 - Func<string,bool>。

重构时,您应该只选择“return String.IsNullOrEmpty(word);”部分。

此外,您使用的lambas方式过于复杂。

您可以将LINQ语句重构为:

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

甚至可以是这样:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接