为什么这个匿名方法在lambda的情况下不起作用?

时间:2015-06-20 07:35:07

标签: c# lambda anonymous-function

我正在学习匿名方法,lambdas等,并且找不到它在这里不起作用的原因:

// this does not work
MyDictionary.Keys.Where(delegate(string s) { s.Length == 5; });

// this works
MyDictionary.Keys.Where(w => w.Length == 5);

2 个答案:

答案 0 :(得分:11)

你忘了return声明的结果:

MyDictionary.Keys.Where(delegate(string s) { return s.Length == 5; });

delegate视为一个完整的方法,除了命名部分之外,必须尽可能与独立的方法相同。所以,你可以把它想象成:

delegate(string s) {
    // you would need to return something here:
    return s.Length == 5; 
}

更新:

另外,想想这两个lambdas:

MyDictionary.Keys.Where(w => w.Length == 5); // works
MyDictionary.Keys.Where(w => { w.Length == 5 }); // does not work

为什么第二个不工作?这样想就可以更好地了解正在发生的事情。这只是简化图片:

第一个lambda是一个语句:w.Length == 5,一个语句有一个实际返回它的结果。不?

但第二个:{ w.Length == 5 }是一个块。除了明确地执行此操作之外,块不会返回任何内容。

答案 1 :(得分:1)

您必须在委托正文中添加return语句,如下所示:

MyDictionary.Keys.Where(delegate(string s) { return s.Length == 5; });

你可以像lambda版本中箭头所暗示的那样return,这就是它工作的原因。