c # правдивые и ложные ценности

Я думаю, что вы можете искать функции окна: http://spark.apache.org/docs/latest/api/python/pyspark.sql.html?highlight=window#pyspark.sql. Окно

https://databricks.com/blog/2015/07/15/introducing-window-functions-in-spark-sql.html

Вот пример в Scala (теперь у меня нет Spark Shell с Hive, поэтому я не смог проверить код, но я думаю, что он должен работать):

case class MyRow(name: String, id_sa: String, id_sb: String)

val myDF = sc.parallelize(Array(
    MyRow("n1", "a1", "b1"),
    MyRow("n2", "a1", "b2"),
    MyRow("n3", "a1", "b2"),
    MyRow("n1", "a2", "b2")
)).toDF("name", "id_sa", "id_sb")

import org.apache.spark.sql.expressions.Window

val windowSpec = Window.partitionBy(myDF("id_sa")).orderBy(myDF("id_sb").desc)

myDF.withColumn("max_id_b", first(myDF("id_sb")).over(windowSpec).as("max_id_sb")).filter("id_sb = max_id_sb")

Вероятно, есть более эффективные способы достижения тех же результатов с помощью функций Window, но я надеюсь, что это указывает на правильное направление.

29
задан Mark Amery 4 September 2017 в 23:14
поделиться

10 ответов

C # имеет только буквальные значения true и false.

C # требует, чтобы вы были очень явными в своих декларациях, поскольку это язык со строгой типизацией, в отличие от JavaScript, который может при необходимости выполнять неявные преобразования.

Важно отметить, что «строгая типизация» не является причиной, по которой C # неявно не преобразуется в значения «истинность / ложь». Язык намеренно пытается избежать ловушек в других скомпилированных языках, таких как C ++, где определенные значения могут быть достоверными, например, «0» или «1», которые могут позволить вам сделать синтаксическую ошибку, которую вы можете не заметить до времени выполнения, когда ваш код ведет себя неожиданно.

40
ответ дан Dan Herbert 4 September 2017 в 23:14
поделиться

По умолчанию C # предоставляет только true и false.

Однако, вы можете иметь свои собственные пользовательские типы, становящиеся «истинными» и «ложными», реализуя оператор true. Когда тип реализует оператор true, экземпляры этого типа могут использоваться как логическое выражение. Из раздела 7.19 Спецификации языка C # :

Когда логическое выражение имеет тип, который не может быть неявно преобразован в bool, но реализует оператор true, после оценки expression, оператор true, предоставляемый этим типом, вызывается для получения значения bool.

Тип структуры DBBool в §11.4.2 предоставляет пример типа, который реализует оператор true и оператор false.

Вот фрагмент кода объявления оператора true (который, вероятно, выполнит то, что вы хотели сделать в своем вопросе):

public static bool operator true(MyType myInstance)
{
    return myInstance != null;
}

Если вы реализуете true, то вы должны также реализовать оператор false.

25
ответ дан Trumpi 4 September 2017 в 23:14
поделиться

Краткий ответ:

В C #:

  • true: всегда true
  • false: всегда false

Все остальное не является логическим значением.

13
ответ дан dtb 4 September 2017 в 23:14
поделиться

Подобный код будет (и должен) не компилироваться. Если вы хотите переопределить это поведение, вы можете создать неявное преобразование в логическое значение. Примерно так:

public class Foo {
    public static implicit operator bool(Foo me) {
        if (me == null) {
            return false;
        }

        return true; // maybe add more logic before saying True
    }
}

Я бы назвал это плохой практикой, потому что для программиста, не знакомого с вашим проектом, не сразу понятно, какая логика обеспечивает логическое преобразование. Более идиоматический способ сделать это - явно рассказать читателю, что делает ваш код, как это делает встроенный класс String, с помощью статической вспомогательной функции:

if (String.IsNullOrEmpty(str){
    // ...
}

Код пишется только один раз, и читаю часто; оптимизировать для удобства чтения.

11
ответ дан ojrac 4 September 2017 в 23:14
поделиться

Правильный ответ на ваш вопрос находится в разделе 7.19 спецификации C # 3.0, которую вы легко найдете в Интернете. Для вашего удобства, соответствующий текст:

7.19 Булевы выражения

Булево-выражение - это выражение, которое дает результат типа bool.

Управляющим условным выражением оператора if [...] является логическое выражение. [...]

Булево выражение должно иметь тип, который может быть неявно преобразован в bool, или тип, который реализует оператор true. Если ни одно из требований не выполнено, возникает ошибка времени компиляции.

Если логическое выражение имеет тип, который не может быть неявно преобразован в bool, но реализует оператор true, то после вычисления выражения вызывается реализация оператора true, предоставляемая этим типом, для получения значения bool.

Нет никаких других типов, кроме самого bool, которые неявно преобразуются в bool посредством встроенного преобразования, но, конечно, пользовательские неявные преобразования в bool могут быть определены пользователем.

15
ответ дан Eric Lippert 4 September 2017 в 23:14
поделиться

C # - статически типизированный язык, то есть тип объектов имеет значение при настройке, что это такое.

Например, «4»! = 4.

JavaScript, однако, является языком с динамической типизацией, поэтому типы не имеют большого значения.

Так в JavaScript «4» == 4.

«Истинные» значения - это значения, которые просто удовлетворяют x == true, в то время как «ложные» значения - нет.

Без безопасности типов некоторые функции, такие как перегрузка, приведут к непредсказуемому поведению.

Для получения дополнительной информации, вы можете увидеть здесь .

-5
ответ дан MiffTheFox 4 September 2017 в 23:14
поделиться

Оператор if вычисляет что-то, что может быть преобразовано в / равно / возвращает логическое значение или само логическое значение ... проверка на нулевое значение, например, obj! = Null, является одним из таких выражений,

'if (obj ) 'может работать, только если obj способен конвертировать в bool, а не если он нулевой.

3
ответ дан CRice 4 September 2017 в 23:14
поделиться

Если obj является типом, который вы создали, вы можете определить пользовательское неявное преобразование в bool.

0
ответ дан Peter Tate 4 September 2017 в 23:14
поделиться

Вы можете определить свою собственную правду и ложь с помощью методов расширения.

public static bool Falsy(this object obj) {
        if(obj == null) return true;
        if (obj is string)
            if(obj as string == string.Empty) return true;
        if(obj is byte)
            if((byte)obj == 0) return true;
        if(obj is sbyte)
            if((sbyte)obj == 0) return true;
        if(obj is short)
            if((short)obj == 0) return true;
        if(obj is ushort)
            if((ushort)obj == 0) return true;
        if(obj is int)            
            if((int)obj == 0) return true;
        if(obj is uint)
            if((uint)obj == 0) return true;
        if(obj is long)
            if((long)obj == 0) return true;
        if(obj is ulong)
            if((ulong)obj == 0) return true;
        if(obj is float)
            if((float)obj == 0) return true;
        if(obj is double)
            if((double)obj == 0) return true;
        if(obj is decimal)
            if((decimal)obj == 0) return true;
        if(obj is IEnumerable<object>)
            if((obj as IEnumerable<object>).Count<object>() == 0)
                return true;
        if(obj is Array)
            if(((Array)obj).Length <= 0)
                return true;
        if(obj is ObjectId)
            if(((ObjectId)obj).Pid == 0) return true;
        if(obj is System.Collections.ObjectModel.ObservableCollection<M>)
            if(((ObservableCollection<M>)obj).Count <= 0) return true;
                return false;
}

public static bool Truthy(this object obj) {
   return !Falsy(obj);
}

Таким образом, вы можете сделать что-то вроде:

if (customerList.Falsy ()) {throw new Exception («Не может быть нулевым или пустым.»); }

0
ответ дан LEMUEL ADANE 4 September 2017 в 23:14
поделиться

Предыдущий ответ правильный. Однако у меня есть метод расширения, который я использую в некоторых редких случаях:

public static bool IsTruthy(this object obj)
{
    if (obj == null || obj is DBNull)
        return false;

    var str = obj as string;
    if (str != null)
        return !string.IsNullOrWhiteSpace(str) && 
            !str.Trim().Equals(bool.FalseString, StringComparison.OrdinalIgnoreCase);

    try
    {
        if (Convert.ToDecimal(obj) == 0)
            return false;
    }
    catch { }

    if (obj is BigInteger)
        return ((BigInteger)obj) != 0; 

    return true;
}

Некоторые примечания по этому поводу:

  • Этот метод несовместим с тем, как javascript обрабатывает строку «False» "
  • Этот метод возвращает true для пустых перечислимых объектов, что согласуется с javascript
3
ответ дан Ronnie Overby 4 September 2017 в 23:14
поделиться