Как объявить временные переменные как выражения C #? - PullRequest
0 голосов
/ 14 января 2019

Есть ли способ объявить временные переменные в выражениях для повторного использования промежуточных результатов?

Мотивация заключается в том, чтобы по-прежнему иметь возможность использовать цепочки вызовов беглого стиля и методы выражения выражений, когда вам нужно использовать вычисленный результат более одного раза в логике или преобразованиях, например,

public static string Foo(IBar bar)
{
    var result = bar.LongCalculation();

    return result.HasError
        ? throw new Exception()
        : result.ToString();
}

Я думал, что смогу использовать ключевые слова запроса let / select linq, но это невозможно без предложения from, например:

public static string Foo(IBar bar) =>
    let result = bar.LongCalculation()                
    select result.HasError
        ? new Exception()
        : result.ToString();

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Мой предпочтительный подход - Тимоти Шилдс ответ здесь:

Как «впустить» в лямбда-выражение?

Создать метод расширения, похожий на оператор канала F #:

public static class FunctionalExtensions
{
    public static TResult Pipe<T, TResult>(this T value, Func<T, TResult> func) =>
        func(value);
}

И назовите это так

public static string Foo(IBar bar) =>
    bar.LongCalculation()
       .Pipe(result => result.HasError
           ? throw new Exception()
           : result.ToString();
0 голосов
/ 14 января 2019

Вы можете использовать метод расширения:

public static class LongCalculationExtensions
{
    public static ILongCalculationResult ThrowIfHasError(this ILongCalculationResult result)
    {
       if(result.HasError) throw new Exception("Your exception here");

       return result;
    }
}

Тогда вы можете использовать это так:

public static string Foo(IBar bar) => bar.LongCalculation().ThrowIfHasError().ToString();   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...