15

私はC#の機能面で新しいです、質問が不完全であるならば申し訳ありません。

次の間違ったコードがある場合:

var jobSummaries = from job in jobs
                   where ...
                   select new 
                   {
                        ID = job.ID,
                        Description = job.Description,
                        FileName = (job) => {
                                  // primitive logic not 
                                  // worth to become a named method
                                  try { return job.Files[0].LocalName); }
                                  catch { return null as string; }
                                 }
                   };

このコードは、次の正当化されたコンパイラエラーを生成します。

ラムダ式を匿名型プロパティに割り当てることはできません

上記のコードは、デリゲートをFileNameプロパティに設定します。しかし、それは私の目的ではありません。コードを次のように機能させたいのですが、メソッドに名前を付けません。

var jobSummaries = from job in jobs
                   where ...
                   select new 
                   {
                        ID = job.ID,
                        Description = job.Description,
                        FileName = this.ExtractFileName(job)
                   };

...
private string ExtractFileName(Job job)
{
     try { return Path.GetFileName(job.Files[0].LocalName); }
     catch { return null as string; }
}

助言がありますか?

4

4 に答える 4

17

匿名関数を直接呼び出すには、これが機能します。

int result = new Func<int, int>( (int i) =>{ return i + 5; } ).Invoke(3);
// result = 8

しかし、私は同意します、int result = (i => i + 5)(3);はるかに涼しいでしょう=)

于 2010-03-03T13:32:27.310 に答える
3

私の知る限り、ラムダ式はインスタンス自体(タイプExpression<Func<T>>など)であるため、そのようなラムダ式をインライン化することはできません。

ただし、これを行うことはできます(これは、OPによって提供されるようになったため、fileNameの計算で更新されます)。

var jobSummaries = from job in jobs
                   where ...
                   let fileName = job.Files.Select(f => f.LocalName).FirstOrDefault()
                   select new 
                   {
                        ID = job.ID,
                        Description = job.Description,
                        FileName = fileName
                   };

キーワードの使用に注意してください。これにより、LINQ式内letの変数からファイル名を直接抽出できます。job

于 2010-03-03T13:33:06.620 に答える
2

ラムダ関数を呼び出していないため、コンパイラーが文句を言っています。それを定義しています。コンパイラが許可する場合は、値ではなく関数であるFileNameプロパティがあります。

「プリミティブロジック」を式として記述できる場合は、それを代入ステートメントに直接記述できます。

于 2010-03-03T13:34:29.430 に答える
0

選択に拡張子を使用するのはどうですか。だからあなたはあなたの小さな論理を内部で行うことができます

var jobSummaries = jobs.Select(j =>
            {
                var someVar = j + "bla";
                return new
                    {
                        somelogic = someVar
                    };

            });
于 2013-02-13T01:15:09.593 に答える