Я подозреваю, что вы пришли из Python фона , где такое поведение разрешено.
В Scala этого достичь невозможно как есть, потому что структура if / else
создает новый блок, а то, что определено в блоке, находится только в таком блоке.
Вы можете исправить это с помощью изменяемой переменной ...
var output: DataFrame = _
if(df2.isEmpty){
output = df1
}
else{
output = df2
}
Однако, это очень Java и идет вразрез с неизменным принципом.
В Scala блок является выражением, и поэтому они могут возвращать значения.
Таким образом, это более идиоматический способ решения проблемы в Scala .
val output = if(df2.isEmpty) df1 else df2
Вы не добавили функциональность, которая только полезна для определенного приложения или контекста, Ваше расширение ясно называют, и поведение очевидно, не имея необходимость смотреть на реализацию.
Ответ "да, Это"
Взгляды, хорошие мне, хотя это кажется немного нетрадиционным.
Можно также использовать синтаксис метода LINQ для той задачи (при помощи Системы. Пространство имен Linq):
object[] objects = new object[10];
objects.Contains(new MyClass());
Хм позвольте мне думать момент... О, Вы уже использование его. Но Вы поместили его в отдельный метод вместо того, чтобы назвать его непосредственно.
Необычно записать дополнительный метод для неограниченного T
. Не в последнюю очередь этот подход быстро сделает Ваш intellisense довольно трудно для использования.
В то время как допустимый, я, вероятно, избежал бы этого, поскольку дополнительный метод - возможно, просто использует стандартный статический служебный метод.
Синтаксис инициализатора массива C# 3 мог бы быть легче?
bool isTrue = new[] { 1, 2, 3 }.Contains(3);
Конечно, для больших наборов данных, Вы могли бы хотеть кэшировать a HashSet<T>
где-нибудь;-p
Это кажется довольно справедливым, но я предпринял бы шаги назад. Можно ли поместить какое-либо значение бизнеса в сравнение? Каковы те значения? Возможно, Вы были бы более обеспечены с названным методом IsSpecialCustomerLocation
или что-то, что выражает фактическое намерение кода.
Вы действительно намереваетесь сделать, Содержит, и гарантия, которую Вы будете применять, Содержит на всех возможных объектах, где Вы могли бы использовать этот дополнительный метод?
Если некоторые данные объекты протестируют равенство путем перегрузки оператора == затем то универсальное решение перестанет работать. Это делает его не истинным эквивалентом нескольких == тесты. Это - также хороший пример опасности записать дополнительные методы!
Следующие Linq кодируют работы при реализации перегрузки оператора, а также если Вы используете значение по умолчанию == значение сравнения ссылок на объект, чтобы сказать, что значение является на самом деле тем же объектом как value1, 2, 3 или 4, учитывая V как тип объекта Ваших значений в данном случае:
V[] lv = { value, value2, value3, value4 };
if (lv.Any( v => v==value))
// do something
Или краткая версия:
if (new List<V>{value, value2, value3, value4 }.Any( v => v==value))
// do something
Я не мог заставить вышеупомянутые лямбда-выражения работать в универсальном дополнительном методе.
Как польза (если не важный) примером того, что я думаю, является прекрасный, читаемый синтаксис, идиома в Python была бы
if value in (value1, value2, value3, value4):
Я сделал бы статический класс с этой целью. Мне не нравится то решение, потому что оно добавляет метод ко всем классам, который кажется небольшим излишеством. Однако это действительно способом идет с OOD, потому что Вы спрашиваете объекты выполнить функции на себе (своего рода).
Однако, я пошел бы с допускающим повторное использование классом вместо этого, потому что я вижу, как антишаблон мог сформироваться. Я еще не называю это антишаблоном, но если бы слишком многие из тех конструкций открываются, я назвал бы это антишаблоном удобочитаемости, так как каждый объект быть нарушенным дополнительными методами. Я вид взгляда на него как загрязнение пространства имен, но членское загрязнение класса.
if (ConditionHelper.IsEqualToAny(value, value1, value2, value3))
{
// Do something
}
Делает то же задание и ничего не загрязняет.
Если вы проверяете только значение Enum (как вы сказали в комментарии к ответу Роджерса), вы должны использовать FlagsAttribute в Enum.
[Flags]
public enum Value
{
Value1 = 0,
Value2 = 1,
Value3 = 2,
Value4 = 4
}
Value value = Value.Value1;
if (value | Value.Value1 | Value.Value2 | Value.Value3 | Value.Value4)
{
// You can also use other bitwise operations, like & (AND), ^ (XOR) and ~ (NOT)
}
В противном случае; если он специфичен для домена, добавьте его в свою бизнес-логику. Если он общий, создайте вспомогательный класс.