假设您有以下代码:
那很简单,但如果我想将lambda表达式应用于select中的s,同时仍然将其保留为声明式查询表达式,该怎么办呢?换句话说:
当然这段代码无法编译。但是,我如何在不转换为流畅语法的情况下插入一个lambda表达式呢?
更新:在StriplingWarrior的指导下,我有了一个复杂但可编译的解决方案。
关键在于将其转换为
string encoded="9,8,5,4,9";
// Parse the encoded string into a collection of numbers
var nums=from string s in encoded.Split(',')
select int.Parse(s);
那很简单,但如果我想将lambda表达式应用于select中的s,同时仍然将其保留为声明式查询表达式,该怎么办呢?换句话说:
string encoded="9,8,5,4,9";
// Parse the encoded string into a collection of numbers
var nums=from string s in encoded.Split(',')
select (s => {/* do something more complex with s and return an int */});
当然这段代码无法编译。但是,我如何在不转换为流畅语法的情况下插入一个lambda表达式呢?
更新:在StriplingWarrior的指导下,我有了一个复杂但可编译的解决方案。
var result=from string s in test.Split(',')
select ((Func<int>)
(() => {string u="1"+s+"2"; return int.Parse(u);}))();
关键在于将其转换为
Func<string,int>
,然后对每次选择迭代使用 (s)
的 lambda 进行评估。有没有更简单的方法(即,不需要将其转换为 Func 并进行评估,或者通过保持查询表达式语法来实现相同的最终结果的更少冗长的内容)?请注意:上面的 lambda 内容是微不足道且示例性质的,请勿更改它。更新2:是的,我是疯狂的 Mike,回来提供另一种(更漂亮?)的解决方案:public static class Lambda
{
public static U Wrap<U>(Func<U> f)
{
return f();
}
}
...
// Then in some function, in some class, in a galaxy far far away:
// Look what we can do with no casts
var res=from string s in test.Split(',')
select Lambda.Wrap(() => {string u="1"+s+"2"; return int.Parse(u);});
我认为这种方法可以解决问题,而且不需要使用丑陋的强制转换和冗长的括号。类似Lambda.Wrap的通用方法是否已经在.NET 4.0框架中出现,以便我不必重新发明轮子?为了不过多地负担这个讨论,我已经将这个问题移到了它自己的问题中:.NET 4.0中是否存在"Wrap"通用方法。
join
或from
时非常方便,否则将需要一些非常混乱的手工编码匿名类型。 - StriplingWarrior