条款错误的Lambda

时间:2012-06-22 10:51:06

标签: c# lambda

我正在尝试写下面的lambda,但我的语法不正确。

Result = ListOfNumbers.Where(val => { val != Num1; val != Num2; }).ToList()[0];

我得到的错误是

  

并非所有代码路径都返回type的lambda表达式中的值   'System.Func <int,int,bool>'

也许有更好的方法来做到这一点......我知道ListOfNumbers中有数字1,2和3(按此顺序)。此时Num1和Num2将分别为1,2或3(尽管它们不能相同)。我希望我的结果是ListOfNumbers中的“其他”数字。希望很清楚。如果你能想到一种更简洁的方式,我很乐意听到它。

有什么想法吗?

7 个答案:

答案 0 :(得分:2)

您需要将其更改为

val => val != Num1 && val != Num2 

如果我编写您提供的代码,因为它可能会看到错误:

public bool Predicate(int val)
{
   val != Num1;
   val != Num2;
}

即。 - 返回声明在哪里?

虽然 - 请注意,实际上无法使用错误Only assignment, call, increment, decrement, and new object expressions can be used as a statement进行编译 - lambdas中的编译器规则略有不同,因此您会得到不同的错误,但最终出于同样的原因 - 在您的情况下你的lambda路径都没有返回任何东西。

答案 1 :(得分:1)

将lambda更改为:

ListOfNumbers.Where(val =>  val != Num1 && val != Num2)

答案 2 :(得分:1)

你真的想要这样做吗?

Result = ListOfNumbers.Where(val => val != Num1 && val != Num2).ToList()[0];

另外,如果列表没有元素怎么办?在通过索引访问它之前,您应该更好地检查它。

答案 3 :(得分:1)

您收到错误,因为在Where子句中没有获得任何bool,您需要将lambda表达式更改为:

Result = ListOfNumbers.Where(val =>  val != Num1 && val != Num2).ToList()[0];

答案 4 :(得分:0)

由于您的代码期望System.Func<int,int,bool>委托返回布尔值,因为在where where中,您应该按以下方式定义它:

Result = ListOfNumbers.Where(val => { val != Num1 && val != Num2; }).ToList()[0];

答案 5 :(得分:0)

我想你想要产生这样的东西:

Result = ListOfNumbers.Where(val => val != Num1 && val != Num2).ToList()[0];

答案 6 :(得分:0)

如果在lambda empression中创建一个块,则必须使用return语句(如果lambda定义了结果类型)。

如果您只想要第一个元素,可以使用FirstOrDefault代替Where

Result = ListOfNumbers.FirstOrDefault(val => val != Num1 && val != Num2 );

带一个块:

Result = ListOfNumbers.FirstOrDefault(val => 
            { 
               var b = val != Num1 && val != Num2; 
               return b;
            } 
         );

我用了&&,但我真的不知道你的病情是什么......