你能用一个函数参数做一个lambda表达式,比如:
(x = (foo(value)) => ( x != null || x == somethingElse))
编辑:Linq示例(根据Selman22'建议):
这不起作用:
result = JsonConvert.SerializeObject((from theme in _themes select new { id = theme.Key, available = (x => { x = _association.getInv(theme.Key); return (x == null || x == guid ); }) }).ToArray<object>());
答案 0 :(得分:3)
在这里,您要创建一个lambda语句,并尝试为其分配可用属性:
x => { x = _association.getInv(theme.Key); return (x == null || x == guid ); }
您可能会认为这将返回一个值并将其分配给available
,但它不是.Lambda语句只是普通方法的语法糖。所以它不会被执行直到它被调用。在这种情况下,您需要创建一个方法,您可以将theme.Key
作为参数传递,检查getInv
的结果并返回结果,然后您可以调用您的函数并将结果分配给可用属性< / p>
select new { id = theme.Key, available = MyFunction(theme.Key) }
答案 1 :(得分:0)
@ Selman22解释了如何解决您的问题,但我想补充一点关于在LINQ中使用lamdas的困难,就像您尝试的那样。问题是lambas确实只是委托的语法糖,并且编译器无法在看到lambda表达式时大肆猜测使用哪个委托。 考虑以下(完全没有意义的)示例:
public class Program
{
private static void Main(string[] args)
{
int[] themes = {1, 2, 3};
//var a = themes.Select(i => new {f = j => i%2 == 0}); this line gives an error
var b = themes.Select(i => new {f = new Func<int, bool>(j => i%2 == 0)});
var c = themes.Select(i => new {f = new MyDelegate(j => i%2 == 0)});
}
private delegate bool MyDelegate(int i);
}
带有a
变量的行无法编译,因为编译器不知道是否应该创建一个匿名类,其字段f
的类型为Func<int, bool>
或类型为{{1或其他一些委托。其他两行完全有效。
这个想法是:当你使用匿名类型的lambdas时要小心。