? x : y, что это значит?

#c# #.net

#c# #.net

Вопрос:

 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, что это значит?

Ответ №1:

это эквивалент

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

Смотрите документацию MSDN (старая версия / новая версия) для получения более подробной информации и примеров

Ответ №2:

Это троичный оператор. Он инкапсулирует if-else-return в одной строке.

Комментарии:

1. троичный означает просто 3 части! (аналогично унарному и двоичному). Это более точно известно как условный оператор.

2. Я сказал, что это a троичный оператор, а не это the троичный оператор. Ссылки передают их оператору.

Ответ №3:

Это условный оператор C #.

Это позволит вам указать условие и два выражения. Когда условие выполняется, возвращается первое выражение. Когда значение равно false , возвращается второе выражение. В данном случае вы используете это как условие:

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

Когда это значение равно true, x возвращается, когда false, y . Созданный выше лямбда-код фактически совпадает с написанием:

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

Ответ №4:

На самом деле это немного больше, чем ? x : y

То, что вы видите, называется троичным оператором и в основном является сокращением классического оператора if / else. Троичный оператор принимает следующий вид:

 <boolean_expression> ? <value_to_use_if_true> : <value_to_use_if_false>
  

В вашем случае логическое выражение равно:

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

И, если это выражение оценивается как true, вы получите значение:

 x
  

В противном случае вы получите:

 y
  

Ответ №5:

a ? b : c это троичный оператор, он переводится как:

 if(a)
    b;
else
    c;
  

Комментарии:

1. Однако b и c являются не утверждениями, а выражениями.

Ответ №6:

Троичный оператор ? — если условие в LHS of ? истинно, возвращает x — если условие ложно, возвращает y

Ответ №7:

Это условный оператор

BoolOpeartor ? Истинное значение : ложное значение;

Ответ №8:

Это то же самое, что:

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

Ответ №9:

это троичный оператор

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

        .
  

Или просто

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

Ответ №10:

Код, который вы опубликовали:

 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, где возвращаемый результат выбирается следующим образом: {условие true / false} ? {значение, если true} : {значение, если false}