Как корректно перенести цепочку методов на разные строки?

Стандартной практикой в LINQ является запись методов "цепочкой" - один за другим, каждый метод на своей строке:

var nodes = Enumerable
        .Range(0, nodesCount)
        .Select(z => new Node(z))
        .ToArray();

Помимо LINQ, подобный подход применяется и для цепочки вызовов обычных методов, для упрощения чтения и восприятия и уменьшения длины строки. Однако с ними уже не все так логично и интуитивно, как с LINQ, на мой взгляд.

Прошу подсказать, как, к примеру, разложить следующую цепочку на 3-4 строки:

return CreateFromCsFiles(OpenFileHelper.OpenCodeFile(File.ReadAllText(pathToCsprojFile)).ToArray());

Как ни пробовал, все равно получается каша. Заранее спасибо!


Ответы (1 шт):

Автор решения: Alexander Petrov

Можно ввести дополнительные переменные:

var text = File.ReadAllText(pathToCsprojFile);
var array = OpenFileHelper.OpenCodeFile(text).ToArray();
return CreateFromCsFiles(array);

В некоторых языках есть специальный оператор конвейера - pipe operator. Например, в F# таким является |>. Если интересно, можно посмотреть его применение в документации.

За неимением такового, в C# можно сделать метод расширения.

public static class PipeExtension
{
    public static TOut Pipe<TIn, TOut>(this TIn input, Func<TIn, TOut> fn)
    {
        return fn(input);
    }
}

Код взят из доклада Pipeline Oriented Programming (pdf по ссылке), ScottWlaschin. Есть и видео от автора с таким же названием.

С его помощью код можно записать так:

return File.ReadAllText(pathToCsprojFile)
    .Pipe(OpenFileHelper.OpenCodeFile).ToArray()
    .Pipe(CreateFromCsFiles);
→ Ссылка