用C#/ LINQ中的匿名方法替换常规方法

dev*_*xer 8 c# linq lambda anonymous-methods

我有一个LINQ查询,如下所示:

public IEnumerable<Foo> SelectFooBars()
{
    return
        from
            f in foos
        join
            b in bars
            on f.BarId equals b.Id
        select
            AddMissingProp(f, b.MissingProp);
}

public void AddMissingProp(Foo foo, string missingProp) // substitute this with inline lambda
{
    foo.MissingProp = missingProp;
    return foo;
}
Run Code Online (Sandbox Code Playgroud)

我想AddMissingProp在我的select条款中摆脱并使用某种形式的lambda .

我试过......

...
select
    (f, b) => { f.MissingProp = b.MissingProp; return f }
Run Code Online (Sandbox Code Playgroud)

...但我收到以下错误:

名为'f'的局部变量不能在此范围内声明,因为它会给'f'赋予不同的含义,'f'已在'父或当前'范围内用于表示其他内容.

我如何"lambda-ize"我的查询?


更新

这也行不通:

...
select
    () => { f.MissingProp = b.MissingProp; return f }
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

join子句中某个表达式的类型不正确.调用"加入"时类型推断失败.

我根本没有改变join条款,所以我很困惑.

Doc*_*own 5

我认为icambron是对的,恕我直言,更好的可读版本是这样的:

  var fooBar = from 
                 f in foos
               join 
                 b in bars
                 on f.BarId equals b.Id 
               select new {f,b};

   foreach(var x in fooBar)
        x.f.MissingProp = x.b.MissingProp;

   // EDIT due to comments: add this if you 
   // need IEnumerable<Foo> returned
   return fooBar.Select(fb => fb.f);
Run Code Online (Sandbox Code Playgroud)

这些from join select语句用于查询,不应该误用它们来改变序列的内容.

编辑:这是另一个链接提供一些见解为什么使用功能形式ForEach不是一个好主意.

  • 你也应该能够做`var foobar =(....).ForEach(....); `和一行吧! (2认同)

Rod*_*man 3

您可以在 lambda 表达式中为参数指定类型,但需要使用不同的名称,因为您已经在查询中使用了 f 和 b。

(Foo f1, Bar b1) => ...

编辑

return
(
    from 
        f in foos 
    join
        b in bars 
        on f.BarId equals b.Id 
    select 
        new {f, b}
).select(foobar => {foobar.f.BarId = foobar.b.Id; return foobar.f});
Run Code Online (Sandbox Code Playgroud)