Это фильтр после перекрестного соединения
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
В 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 #. Он использует вывод типа, чтобы знать, что он возвращает, и на самом деле это оператор, а не функция. Это означает, что нет проблем с предварительной оценкой выражений, даже если они имеют семантику функций.
VB.NET :
If(someBool, "true", "false")
C #
someBool ? "true" : "false";
Это тернарный оператор ?
string newString = i == 1 ? "i is one" : "i is not one";
тернарный оператор
bool a = true;
string b = a ? "if_true" : "if_false";
Также полезен оператор объединения ??:
VB:
Return Iif( s IsNot Nothing, s, "My Default Value" )
C #:
return s ?? "My Default Value";