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条款,所以我很困惑.
我认为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不是一个好主意.
您可以在 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)
| 归档时间: |
|
| 查看次数: |
3917 次 |
| 最近记录: |