C#LINQ-与方法组一起使用时是否选择过滤器空值?
今天,我编写了一些代码,它获取a类实例列表,并使用静态工厂方法创建B类实例列表:C#LINQ-与方法组一起使用时是否选择过滤器空值?,c#,linq,resharper,method-group,C#,Linq,Resharper,Method Group,今天,我编写了一些代码,它获取a类实例列表,并使用静态工厂方法创建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 =>
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时建议我“转换为方法组”。我想知道这意味着什么,并在这个网站上找到了一些有趣的答案。例如:
这里还有Asad对stitty答案的评论(.Select(x=>transform(x))可以是.Select(transform))
因此,我将代码更改为:
var bList = aList.Select(B.CreateB).Where(b => b != null).ToList();
这也像预期的那样起作用,但现在我开始问我的问题。Resharper现在告诉我可以删除lambda表达式的位置,因为b!=null“始终为真”
我到处玩,而Resharper是正确的,但为什么呢?当我使用方法组时,Select()返回的集合为什么会有差异?当我使用一个方法组时,为什么Select()似乎会从集合中过滤掉空值?BothaList.Select(a=>B.CreateB(a)).Where(B=>B!=null.ToList()
和aList.Select(B.CreateB).Where(B=>B!=null).ToList()代码>使用与选择方法相同的重载
我使用LinqPad对其进行了测试,得到了以下输出:
因此,Select
不会过滤任何内容。您正在使用哪个版本的Resharper和VisualStudio
VS2013上最新的ReSharper没有告诉任何事情:
出于好奇-静态方法如何创建B()'返回新的B实例'?它会创建一个继承的类实例吗?我知道这与你的问题无关,只是我以前从未见过这样的设计(而且我也不是专家)。你确定吗?我只是重建了你的例子,我没有得到任何关于删除Where
子句的信息。@shay_uub是一个抽象类,CreateB()返回一个继承类的实例(或null)。@YuvalItzchakov好吧,Resharper没有说“删除Were子句”,它说的是关于B的“表达式总是正确的”空支票,我明白。但我也不明白。谢谢你的测试。我将VisualStudio 2012与Resharper 9.0更新1一起使用。结果表明这是Resharper中的一个bug。我调试了Where子句,将其更改为:.Where(item=>{return item!=null;}),而当Resharper说“表达式总是true”时,它实际上是false。请尝试升级到Resharper 9.1.1或9.2 EAP。如果仍然报告为错误,则为错误,应报告给