1

我的一位同事从以下代码开始:

var newList = new List<>();

foreach(var item in otherList)
{
    newList.Add(GetNewObjectFrom(item));
}

ReSharper 在此处正确识别了 LINQ 的使用,并将其更改为:

var newList = otherList.Select(o => GetNewObjectFrom(o)).ToList();

但是,lambda 是不必要的,可以通过传递方法进一步简化:

var newList = otherList.Select(GetNewObjectFrom).ToList();

我的问题

Visual Studio 2010 Professional 中的任何工具或 ReSharper 的各种变通工具都可以检测到应该进行的这种更改吗?我意识到最好的工具是第二组人眼,这就是这个问题的起点……但我的工作越多由计算机完成越好。

编辑:太棒了,这是一个 ReSharper 错误。这是一个示例程序:

using System.Linq;

namespace ResharperMethodGroupBug
{
    class Program
    {
        static void Main(string[] args)
        {
            var program = new NumberProgram(new NumberProcessor());
            program.Run();
        }
    }

    class NumberProgram
    {
        private readonly INumberProcessor numberProcessor;

        public NumberProgram(INumberProcessor numberProcessor)
        {
            this.numberProcessor = numberProcessor;
        }

        static long SquareNumber(int n)
        {
            return n * n;
        }

        public void Run()
        {
            var listOfNumbers = Enumerable.Range(1, 100).ToList();

            // appropriately triggers "convert to method group"
            var listOfSquares = listOfNumbers.Select(n => SquareNumber(n));

            // does not trigger "convert to method group" when it should
            var listOfCubes = listOfNumbers.Select(n => this.numberProcessor.CubeNumber(n));

            // proof that a method group works here
            var anotherListOfCubes = listOfNumbers.Select(this.numberProcessor.CubeNumber);
        }
    }

    interface INumberProcessor
    {
        long CubeNumber(int n);
    }

    class NumberProcessor : INumberProcessor
    {
        public long CubeNumber(int n)
        {
            return n * n * n;
        }
    }
}

编辑 2:我在 JetBrains 的 Youtrack 上发布了一个问题:http: //youtrack.jetbrains.com/issue/RSRP-301259

4

1 回答 1

3

Resharper 已经检测到这一点并建议简化:

    static void Main(string[] args)
    {
        var items = new[] { 1, 2, 3 };
        var list = items.Select(i => Foo(i)).ToList(); // R# suggests "Convert to method group"
    }

    static int Foo(int i)
    {
        return i;
    }

(使用 VS2010 Pro SP1 和 R# 5.1.3 测试)

于 2012-05-10T16:11:10.933 回答