C# LINQ - Select 与方法组一起使用时是否过滤空值?
C# LINQ - Does Select filter nulls when used with a method group?
今天我写了一些代码,使用静态工厂方法获取 class 个 A 实例列表并创建 class 个 B 实例列表:
public abstract class B
{
public static B CreateB(A a)
{
// return a new B instance or null if a B instance can't be created
}
}
我需要过滤掉空值,所以我使用 LINQ 来完成这两项任务:
var bList = aList.Select(a => B.CreateB(a)).Where(b => b != null).ToList();
代码按预期运行,但我注意到 Resharper 建议,在调用 CreateB 时,我应该 "Convert to method group"。我想知道这意味着什么,并在这个网站上找到了一些有趣的答案。例如:
What is a method group in C#? and a comment by Asad to stitty's answer here Filtering Null values in Select (.Select(x => transform(x)) 可以是 .Select(transform))
所以我将代码更改为:
var bList = aList.Select(B.CreateB).Where(b => b != null).ToList();
这也按预期工作,但现在我开始回答我的问题了。 Resharper 现在告诉我可以删除 Where lambda 表达式,因为 b != null "is always true".
我试了一下,Resharper 是正确的,但为什么呢?为什么使用方法组时 Select() 的返回集合有差异?为什么 Select() 在我使用方法组时似乎从集合中过滤掉了空值?
aList.Select(a => B.CreateB(a)).Where(b => b != null).ToList();
和 aList.Select(B.CreateB).Where(b => b != null).ToList();
都使用相同的 Select
方法重载。
我用 LinqPad 测试了它并得到了以下输出:
所以 Select
不过滤任何东西。您使用的是什么版本的 Resharper 和 VisualStudio?
VS2013 上的最新 ReSharper 没有说明任何问题:
今天我写了一些代码,使用静态工厂方法获取 class 个 A 实例列表并创建 class 个 B 实例列表:
public abstract class B
{
public static B CreateB(A a)
{
// return a new B instance or null if a B instance can't be created
}
}
我需要过滤掉空值,所以我使用 LINQ 来完成这两项任务:
var bList = aList.Select(a => B.CreateB(a)).Where(b => b != null).ToList();
代码按预期运行,但我注意到 Resharper 建议,在调用 CreateB 时,我应该 "Convert to method group"。我想知道这意味着什么,并在这个网站上找到了一些有趣的答案。例如: What is a method group in C#? and a comment by Asad to stitty's answer here Filtering Null values in Select (.Select(x => transform(x)) 可以是 .Select(transform))
所以我将代码更改为:
var bList = aList.Select(B.CreateB).Where(b => b != null).ToList();
这也按预期工作,但现在我开始回答我的问题了。 Resharper 现在告诉我可以删除 Where lambda 表达式,因为 b != null "is always true".
我试了一下,Resharper 是正确的,但为什么呢?为什么使用方法组时 Select() 的返回集合有差异?为什么 Select() 在我使用方法组时似乎从集合中过滤掉了空值?
aList.Select(a => B.CreateB(a)).Where(b => b != null).ToList();
和 aList.Select(B.CreateB).Where(b => b != null).ToList();
都使用相同的 Select
方法重载。
我用 LinqPad 测试了它并得到了以下输出:
所以 Select
不过滤任何东西。您使用的是什么版本的 Resharper 和 VisualStudio?
VS2013 上的最新 ReSharper 没有说明任何问题: