Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将临时变量声明为C表达式?_C#_Expression - Fatal编程技术网

C# 如何将临时变量声明为C表达式?

C# 如何将临时变量声明为C表达式?,c#,expression,C#,Expression,有没有办法在表达式中声明临时变量以重用中间结果 其动机是当您需要在逻辑或转换中多次使用计算结果时,仍然能够使用流畅风格的调用链和表达式体方法,例如 公共静态字符串FooIBar条 { var结果=bar.long计算; 返回result.HasError ?抛出新异常 :result.ToString; } 我想我可能可以使用let/select linq查询关键字,但如果没有from子句,这似乎是不可能的 公共静态字符串FooIBar=> 让结果=bar.long计算 选择result.Has

有没有办法在表达式中声明临时变量以重用中间结果

其动机是当您需要在逻辑或转换中多次使用计算结果时,仍然能够使用流畅风格的调用链和表达式体方法,例如

公共静态字符串FooIBar条 { var结果=bar.long计算; 返回result.HasError ?抛出新异常 :result.ToString; } 我想我可能可以使用let/select linq查询关键字,但如果没有from子句,这似乎是不可能的

公共静态字符串FooIBar=> 让结果=bar.long计算 选择result.HasError ? 新的例外 :result.ToString;
您可以使用扩展方法:

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();   

您可以使用扩展方法:

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();   

我的首选方法是Timothy Shields回答如下:

创建类似于F的管道操作符的扩展方法:

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

我的首选方法是Timothy Shields回答如下:

创建类似于F的管道操作符的扩展方法:

public static class FunctionalExtensions
{
    public static TResult Pipe<T, TResult>(this T value, Func<T, TResult> func) =>
        func(value);
}
我以前对管道的回答需要lambda,一个开销较小的更好的解决方案是利用内联输出声明:

公共静态类函数 { public static T Assignthis T o,out T result=> 结果=o; } 这样称呼它

public static string Foo(IBar bar) =>
    bar.LongCalculation()
       .Pipe(result => result.HasError
           ? throw new Exception()
           : result.ToString();
公共静态字符串FooIBar=> 条形计算 .分配var结果 哈斯洛尔先生 ? 抛出新异常 :result.ToString; 我以前对管道的回答需要lambda,一个开销较小的更好的解决方案是利用内联输出声明:

公共静态类函数 { public static T Assignthis T o,out T result=> 结果=o; } 这样称呼它

public static string Foo(IBar bar) =>
    bar.LongCalculation()
       .Pipe(result => result.HasError
           ? throw new Exception()
           : result.ToString();
公共静态字符串FooIBar=> 条形计算 .分配var结果 哈斯洛尔先生 ? 抛出新异常 :result.ToString;
为什么不在表达式体方法中调用像LongCalculationSafe这样的方法?然后你可以使用任何你需要的代码。为什么你想使用一个表达式体方法?这只是语法糖,可以使用时,身体是一个班轮。如果您需要多行,只需使用常规的方法语法。我更喜欢函数式的流动样式-这是c的方向,并且有兴趣知道它是否有解决方案-由于逻辑/转换中的一个细节需要重用临时。LINQ在这里没有意义。LINQ实际上是一个更好的foreach,因为它可以处理集合并对集合进行迭代。但这里的情况并非如此,您使用的是一个单一的结果对象。LINQ只处理集合迭代,因此即使您将其侵入(例如,通过将单个对象放入列表中),它也不会起到有意义的作用。为什么不在表达式体方法中调用像LongCalculationSafe这样的方法?然后你可以使用任何你需要的代码。为什么你想使用一个表达式体方法?这只是语法糖,可以使用时,身体是一个班轮。如果您需要多行,只需使用常规的方法语法。我更喜欢函数式的流动样式-这是c的方向,并且有兴趣知道它是否有解决方案-由于逻辑/转换中的一个细节需要重用临时。LINQ在这里没有意义。LINQ实际上是一个更好的foreach,因为它可以处理集合并对集合进行迭代。但这里的情况并非如此,您使用的是一个单一的结果对象。LINQ只处理集合迭代,所以即使你黑了它,例如把你的单一对象放在一个列表中,它也不会起到有意义的作用。很有趣,谢谢。这适用于处理频繁发生但不是一般情况的特定情况。顺便说一句,扩展方法可以使用抛出表达式,所以也可以是表达式体。有趣的谢谢。这适用于处理频繁发生但不是一般情况的特定情况。顺便说一句,扩展方法可以使用抛出表达式,因此也可以使用表达式体。