0

有这样的功能:

   private static void EncodeString(ref string str)
    {
        using (RLE inst_rle = new RLE())
        {
            string str_encoded = inst_rle.Encode(ref str);
            Console.WriteLine(

              "\r\nBase string ({0} chars): {1}\r\nAfter RLE-encoding ({2} chars): {3}\r\nCompression percentage: %{4}",
              str.Length, str, str_encoded.Length, str_encoded,
              () => { (100 * (str.Length - str.encoded.Length) / str.Length); }

                             );
        }
    }

我记得这是 C# 中的一种 lambda 风格: () => { < action > ; }

但是遇到这样的错误:

  • 无法将 lambda 表达式转换为类型“对象”,因为它
  • 只有赋值、调用、递增、递减和新对象表达式可以用作语句
  • 不能在匿名方法、lambda 表达式或查询表达式中使用 ref 或 out 参数“str”
  • 不能在匿名方法、lambda 表达式或查询表达式中使用 ref 或 out 参数“str”

如何在我的应用程序(控制台应用程序)中使用 C# EXACLTY 中的 Lambda 而无需明确使用

Delegate / Func<T>,喜欢在() => { }方式吗?

4

3 回答 3

2

我不太确定你为什么要在这里使用 lambda,看起来你想要:

Console.WriteLine(@"\r\nBase string ({0} chars): {1}\r\nAfter RLE-encoding
            (
             {2} chars): {3}\r\nCompression percentage: {4}",
             str.Length, str, str_encoded.Length, str_encoded,
             (100 / str.Length) * (str.Length / str_encoded.Length)
            );

正如评论指出的那样,您需要在格式字符串前面加上前缀,@因为它跨越多行。

于 2013-01-06T18:01:46.460 回答
1

我同意 Lee 的观点,但是当你真的想创建一个这样的 Lamba 并获得它的输出时,你需要明确地转换如下内容:

(Func<int>)(() => (100 / str.Length) * (str.Length / str_encoded.Length)))();

我在玩线程时这样做,而不是在生产代码中

于 2013-01-06T18:11:03.560 回答
1

字符串常量可以在多个带有@前缀的代码行上定义,但是这样你\r\n就行不通了。因此,您可以将字符串片段添加在一起+以达到相同的效果:

private static void EncodeString(ref string str)
{
    using (RLE inst_rle = new RLE())
    {
        string str_encoded = inst_rle.Encode(ref str);
        Console.WriteLine("\r\nBase string ({0} chars): {1}\r\nAfter RLE-encoding" +
        "(" +
         "{2} chars): {3}\r\nCompression percentage: {4}",
         str.Length, str, str_encoded.Length, str_encoded,
         () => { (100 / str.Length) * (str.Length / str_encoded.Length);}
        );
    }
}
于 2013-01-06T18:31:23.077 回答