从 LINQ 中提取 lambda 表达式
Extracting lambda expression from LINQ
我有下一段代码
var query = wordCollection.Select((word) => { return word.ToUpper(); })
.Where((word) =>
{
return String.IsNullOrEmpty(word);
})
.ToList();
假设我想重构这段代码并从 Where 子句中提取 lambda 表达式。在 Visual Studio 中,我只是 select 这个 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);
};
}
问题是为什么这个新方法没有任何输入参数,因为委托 Func 指出 NewMethod1() 应该有一个字符串输入参数?
要获得预期的结果,只需标记这部分 String.IsNullOrEmpty(word)
并提取方法:
private bool NewMethod(string word)
{
return String.IsNullOrEmpty(word);
}
您最初得到的是因为提取创建了一个 returns 委托的方法。不是与委托匹配的方法。它是一种方法,returns 另一种方法。后者接受字符串参数 word
和 returns 布尔结果。
当然,执行上述操作会将您的代码更改为:
.Where((word) => NewMethod(word))
但您可以安全地将其更改为:
.Where(NewMethod)
旁注:
无需在 Linq 查询或任何单行 lambda 中使用 return
关键字,您可以将查询重构为如下所示:
var query = wordCollection.Select(word => word.ToUpper())
.Where(word => string.IsNullOrEmpty(word))
.ToList();
您正在选择整个 lambda,因此它试图将整个 lambda 语句提取为接受单词和 returns 布尔值的委托 - Func 。
重构时你应该只选择 "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();
我有下一段代码
var query = wordCollection.Select((word) => { return word.ToUpper(); })
.Where((word) =>
{
return String.IsNullOrEmpty(word);
})
.ToList();
假设我想重构这段代码并从 Where 子句中提取 lambda 表达式。在 Visual Studio 中,我只是 select 这个 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);
};
}
问题是为什么这个新方法没有任何输入参数,因为委托 Func 指出 NewMethod1() 应该有一个字符串输入参数?
要获得预期的结果,只需标记这部分 String.IsNullOrEmpty(word)
并提取方法:
private bool NewMethod(string word)
{
return String.IsNullOrEmpty(word);
}
您最初得到的是因为提取创建了一个 returns 委托的方法。不是与委托匹配的方法。它是一种方法,returns 另一种方法。后者接受字符串参数 word
和 returns 布尔结果。
当然,执行上述操作会将您的代码更改为:
.Where((word) => NewMethod(word))
但您可以安全地将其更改为:
.Where(NewMethod)
旁注:
无需在 Linq 查询或任何单行 lambda 中使用 return
关键字,您可以将查询重构为如下所示:
var query = wordCollection.Select(word => word.ToUpper())
.Where(word => string.IsNullOrEmpty(word))
.ToList();
您正在选择整个 lambda,因此它试图将整个 lambda 语句提取为接受单词和 returns 布尔值的委托 - Func
重构时你应该只选择 "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();