iif, эквивалентный в c#

Это фильтр после перекрестного соединения

p1.assign(key=1).merge(p2.assign(key=1),on='key').loc[lambda x : x['x_x']!=x['x_y']]
Out[29]: 
   x_x  key  x_y
1   -1    1    0
2   -1    1    2
3    0    1   -1
5    0    1    2
6    2    1   -1
7    2    1    0
71
задан Farinha 20 August 2013 в 10:19
поделиться

5 ответов

В C #, как и в других языках C-стиля, есть тернарный оператор ? . Однако это не полностью эквивалентно IIf () ; есть два важных отличия.

Чтобы объяснить первое отличие, аргумент ложной части для этого вызова IIf () вызывает исключение DivideByZeroException , даже если логический аргумент равен ] Правда .

IIf(true, 1, 1/0)

IIf () - это просто функция, и, как и все функции, все аргументы должны быть оценены перед вызовом. Другими словами, IIf () не выполняет короткое замыкание не в традиционном смысле. С другой стороны, в этом троичном выражении происходит короткое замыкание, и поэтому все в порядке:

(true)?1:1/0;

Другое отличие состоит в том, что IIf () не является типобезопасным. Он принимает и возвращает аргументы типа Object . Тернарный оператор безопасен по типу . Он использует вывод типов, чтобы знать, с какими типами имеет дело. Обратите внимание, что вы можете легко исправить это с помощью вашей собственной общей реализации IIF (Of T) () , но из коробки это не так.

Если вам действительно нужен IIf ( ) в C # вы можете иметь это:

object IIf(bool expression, object truePart, object falsePart) 
{return expression?truePart:falsePart;}

или общую / безопасную по типу реализацию:

T IIf<T>(bool expression, T truePart, T falsePart) 
{return expression?truePart:falsePart;}

С другой стороны, если вам нужен тернарный оператор в VB, Visual Studio 2008 и более поздних версий предоставляет новый оператор If () , который работает как тернарный оператор C #. Он использует вывод типа, чтобы знать, что он возвращает, и на самом деле это оператор, а не функция. Это означает, что нет проблем с предварительной оценкой выражений, даже если они имеют семантику функций.

110
ответ дан 24 November 2019 в 12:52
поделиться

VB.NET :

If(someBool, "true", "false")

C #

someBool ? "true" : "false";
58
ответ дан 24 November 2019 в 12:52
поделиться

Это тернарный оператор ?

string newString = i == 1 ? "i is one" : "i is not one";
1
ответ дан 24 November 2019 в 12:52
поделиться

тернарный оператор

bool a = true;

string b = a ? "if_true" : "if_false";
12
ответ дан 24 November 2019 в 12:52
поделиться

Также полезен оператор объединения ??:

VB:

Return Iif( s IsNot Nothing, s, "My Default Value" )

C #:

return s ?? "My Default Value";
8
ответ дан 24 November 2019 в 12:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: