具有功能参数的Lambda表达式

时间:2014-08-22 21:16:14

标签: c# linq lambda

你能用一个函数参数做一个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>());

2 个答案:

答案 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时要小心。