3

今天我写了一些代码,它获取一个 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 => B.CreateB(a)).Where(b => b != null).ToList();

代码按预期运行,但我注意到 Resharper 建议,在调用 CreateB 时,我应该“转换为方法组”。我想知道这意味着什么,并在这个网站上找到了一些有趣的答案。例如: 什么是 C# 中的方法组?以及 Asad 在此处对 stitty 的回答的评论Filtering Null values in Select (.Select(x => transform(x)) can be .Select(transform))

所以我将代码更改为:

var bList = aList.Select(B.CreateB).Where(b => b != null).ToList();

这也可以按预期工作,但现在我要回答我的问题了。Resharper 现在告诉我可以删除 Where lambda 表达式,因为 b != null “始终为真”。

我玩过,Resharper 是正确的,但为什么呢?为什么使用方法组时 Select() 的返回集合会有所不同?为什么当我使用方法组时 Select() 似乎会从集合中过滤掉空值?

4

1 回答 1

2

两者都aList.Select(a => B.CreateB(a)).Where(b => b != null).ToList();使用aList.Select(B.CreateB).Where(b => b != null).ToList();相同的Select方法重载。

我用 LinqPad 对其进行了测试,得到了以下输出:

LinqPad

所以Select不过滤任何东西。您使用的是什么版本的 Resharper 和 VisualStudio?

VS2013 上的最新 ReSharper 并没有说明什么:

VS2013 上的最新 ReSharper

于 2015-07-16T12:14:42.897 回答