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#のラムダのスタイルです:()=>{<アクション>; }

しかし、そのようなエラーが発生します:

  • ラムダ式をタイプ「オブジェクト」に変換できないため、
  • ステートメントとして使用できるのは、代入、呼び出し、インクリメント、デクリメント、および新しいオブジェクト式のみです。
  • 匿名メソッド、ラムダ式、またはクエリ式内でrefまたはoutパラメータ'str'を使用することはできません
  • 匿名メソッド、ラムダ式、またはクエリ式内でrefまたはoutパラメータ'str'を使用することはできません

明示的に使用せずに私のアプリ(コンソールアプリ)でC#EXACLTYでLambdaを使用する方法

委任/Func<T>、方法の() => { }ように?

4

3 に答える 3

2

ここでラムダを使用する理由がよくわかりません。次のようにします。

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

@文字列定数は、プレフィックスを使用して複数のコード行で定義できます\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 に答える
1

私はリーに同意しますが、本当にこのような Lamba を作成し、その出力を取得したい場合は、次のように明示的にキャストする必要があります。

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

これは、本番コードではなく、スレッドで遊んでいるときに行います

于 2013-01-06T18:11:03.560 に答える