2011-05-10 35 views
3
List<int> list = new List<int> { 2, 5, 7, 10 }; 
int number = 9; 

int closest = list.Aggregate((x,y) => 
    Math.Abs(x-number) < Math.Abs(y-number) ? x : y); 

? x:y,那是什么意思?? x:y,那是什么意思?

回答

9

它的

if Math.Abs(x-number) < Math.Abs(y-number) then use x else use y 

等效见MSDN documentation的更多细节和例子

7

这是一个ternary运营商。它在一行中封装了一个if-else-return

+0

三元刚表示3个部分! (类似于一元和二元)。它更准确地称为条件运算符。 – 2011-05-10 19:27:29

+4

我已经说过它是'a'三元运算符,而不是''三元运算符。链接将他们带到运营商。 – Aliostad 2011-05-10 19:31:25

1

三元运营商? - 如果对? LHS条件为真,则返回x - 如果条件为假,返回y

5

这是C# conditional operator

它可以让你指定一个条件和两个表达式。当条件为真时,返回第一个表达式。当它为假时,返回第二个表达式。在这种情况下,你使用这个作为条件:

Math.Abs(x-number) < Math.Abs(y-number) 

如果这是真的,x返回,当假的,y。上面创建拉姆达是写作实际上是相同的:

int closest = list.Aggregate((x,y) => 
    { 
     if (Math.Abs(x-number) < Math.Abs(y-number)) 
      return x; 
     else 
      return y; 
    }); 
2

a ? b : c是一个三元运算符,将它转换为:

if(a) 
    b; 
else 
    c; 
+0

然而'b'和'c'不是语句,而是表达式。 – Pindatjuh 2011-05-11 16:26:09

1

这是一样的:

if (Math.Abs(x-number) < Math.Abs(y-number)) 
    return x; 
else 
    return y; 
0

它的一个ternary操作

if(Math.Abs(x-number) < Math.Abs(y-number)) 
    true 
else 
    false 

     . 

或者干脆

Math.Abs(x-number) < Math.Abs(y-number) ? x : y 
3

有实际上比多一点吧

您所看到的称为三元运算符,它基本上是经典if/else语句的简写。三元运算符采用以下形式:

<boolean_expression> ? <value_to_use_if_true> : <value_to_use_if_false> 

在你的情况下,布尔表达式是:

Math.Abs(x-number) < Math.Abs(y-number) 

而且,如果这个表达式为真,你会得到的值:

x 

否则,你将得到:

y 
0

你的代码发布:

List<int> list = new List<int> { 2, 5, 7, 10 }; 
int number = 9; 
int closest = list.Aggregate((x,y) => Math.Abs(x-number) < Math.Abs(y-number) ? x : y); 

等同于以下内容:

List<int> list = new List<int> { 2, 5, 7, 10 }; 
int number = 9; 
int closest = list.Aggregate((x,y) => 
{ 
    if(Math.Abs(x-number) < Math.Abs(y-number)) 
    { 
     return x; 
    } 
    else 
    { 
     return y; 
    } 
}); 

你正在使用被称为条件运算符,这是一个速记符号什么的if-else语句,返回的结果选择如下:{真/假条件}? {value if true}:{value if false}