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; }
                                 }
                   };

此代码产生以下合理的编译器错误:

无法将 lambda 表达式分配给匿名类型属性

上面的代码会将委托设置为 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

据我所知,您不能像这样内联 lambda 表达式,因为 lamda 表达式本身就是一个实例(类型Expression<Func<T>>或类似类型)。

但是,您可以这样做(通过计算文件名进行更新,因为现在由 OP 提供):

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

编译器抱怨是因为您没有调用lambda 函数,而是在定义它。如果编译器允许,您将拥有一个 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 回答