2012-06-22 61 views
2

我想写一个像下面这样的lambda,但是我的语法不正确。Lambda在哪里子句错误

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

我得到的错误是

并非所有的代码路径中 类型的lambda表达式返回一个值“System.Func <int,int,bool>

也许有这样做的更好的办法这...我知道ListOfNumbers中有数字1,2和3(按此顺序)。此时Num1和Num2都将是1,2或3(尽管如此,它们不能相同)。我希望我的结果是来自ListOfNumbers的'其他'号码。希望这是明确的。如果你能想到一个更好的方法,我很乐意听到它。

有什么想法?

+4

你的问题的标题无关与实际问题。请编辑标题,以便引用问题。 – Botz3000

+0

非常感谢抱歉,我没有更新前一个问题的标题! – windowskm

回答

2

你需要将其更改为

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

如果我写你所提供的代码,因为这将是作为一个功能,你可能会看到什么是错的:

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

iee - 返回声明在哪里?

虽然 - 注意,这实际上会失败,错误Only assignment, call, increment, decrement, and new object expressions can be used as a statement编译 - 在lambda表达式编译器的规则略有不同,所以你得到一个不同的错误,但最终它是同一种原因 - 你的情况都不你的lambda路径返回任何东西。

+0

最佳答案!谢谢 – windowskm

1

更改为拉姆达:

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

你真的想要这样做吗?

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

另外,如果列表没有元素呢?您应该在通过索引访问它之前检查一下。

1

你所得到的错误,因为里面Where子句你没有得到任何BOOL,您需要将您的lambda表达式更改为:

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

当你的代码预期System.Func<int,int,bool>委托返回布尔值,如在条件所以,你应该在以下方式进行定义:

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

我想你想产生这样的事:

Result = ListOfNumbers.Where(val => val != Num1 && val != Num2).ToList()[0]; 
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; 
      } 
     ); 

我用&&但我真的不知道你是什么条件...