Функция(и) триггера на основе логического результата без использования слова iF

if(someBoolTest()) dothis()
else dothat();

или просто

if(someBoolTest()) dothis();

Было бы неплохо сделать что-то вроде:

someBoolTest() => {dothis(),dothat()}

or

someBoolTest() => dothis()

Это делается на других языках? Как это сделать на C#? (Я не думаю, что мы можем, так почему бы и нет?)

РЕДАКТИРОВАТЬ: я знаю о троичных операциях, но это не делает их лучше. Было бы неплохо сделать это с помощью какой-либо формы лямбда с делегатами.


person LastTribunal    schedule 23.04.2015    source источник
comment
В чем преимущество вашего синтаксиса перед операторами if?   -  person Blorgbeard    schedule 24.04.2015
comment
Вам нужно прочитать это   -  person crthompson    schedule 24.04.2015
comment
Мне действительно неясен смысл этого вопроса. Это просто разглагольствования о том, как вы недовольны тем, что C# не является функциональным языком?   -  person Claies    schedule 24.04.2015
comment
да, это частично тирада. но в то же время он задает вопрос, почему C# не может иметь это языковое расширение.. | Но я доволен C#, это то, что я использую каждый день.   -  person LastTribunal    schedule 24.04.2015


Ответы (4)


Как это сделать на C#?

Используя предложение if-else, как в вашем примере.

Вы можете проявить творческий подход и создать что-то вроде этого:

(SomeBoolTest() ? (Action)DoThis : DoThat)();

Но это ужасно нечитаемый код, не делайте этого.

person Yuval Itzchakov    schedule 23.04.2015
comment
Я уверен, что в функциональных языках есть другой способ выполнения if-else ветвления. Тем не менее, я не вижу в них ничего плохого. - person Yuval Itzchakov; 24.04.2015
comment
@LastTribunal Что такое ругательство? - person Black Frog; 24.04.2015
comment
@Black Он имеет в виду if-else - person Yuval Itzchakov; 24.04.2015
comment
Я просто хотел внести ясность. Потому что if-else — один из основных строительных блоков программирования. А недостаток использования ?: Operator заключается в том, что он не выполняет краткую оценку. - person Black Frog; 24.04.2015
comment
Операторы if являются строительными блоками спагетти-кода. Все усилия в области ООП и шаблонов проектирования были в основном направлены на устранение непристойности слов iF. - person LastTribunal; 24.04.2015
comment
Можете ли вы на самом деле сформулировать, что вы считаете оскорбительным в конструкции if-else? - person Blorgbeard; 24.04.2015
comment
@BlackFrog условный (?:) оператор делает короткое замыкание. - person Blorgbeard; 24.04.2015

Вы можете, но не должны, делать что-то похожее на синтаксис, который вы упомянули, делая что-то глупое, например, написав метод расширения для типа bool, как показано в следующем примере:

public static class UselessExtensions
{
    public static void WhenTrue(this bool evaluatedPredicate, Action whenTrue)
    {
        if (evaluatedPredicate)
            whenTrue();
    }
}

public static class TryingUselessExtensions
{
    public static bool SomeBoolTest()
    {
        return true;
    }

    public static void DoIt()
    {
        SomeBoolTest().WhenTrue(() => Console.WriteLine(true));
    }
}
person Alex    schedule 23.04.2015
comment
Он откладывает ifs на более низкий уровень, что является улучшением - person LastTribunal; 24.04.2015
comment
@Claies Как видите, в ответе конкретно указано что-то похожее на синтаксис ..., его цель не в том, чтобы избавиться от оператора if. - person Alex; 24.04.2015
comment
верно, но в других комментариях постер предположил, что причиной вопроса, в первую очередь, является их неприязнь к if-else, ссылаясь на него, поскольку эти грязные слова будут удалены из всех развитых языков. Это неразумное заявление, но постер ясно дал понять, что им нужна альтернатива if-else, а не просто синтаксис, чтобы скрыть его (если я не в стороне). - person Claies; 24.04.2015

Я считаю, что тернарные операторы - это то, что вы ищете:

переменная = условие? значение_если_истина : значение_если_ложь

Итак, например, вы хотите, чтобы int равнялся 0, если ваше условие выполнено, и 3, если это не так:

int this = 500;
int that = 700;
int n = (this==that) ? 0 : 3;

В этом случае n будет присвоено значение 3! Об этом есть хорошая страница в Википедии, зайдите и посмотрите :)

страница Википедии о тернарных операторах

person Ola Næss Kaldestad    schedule 23.04.2015
comment
Этот подход полезен, когда вы хотите, чтобы условное выражение возвращало значение, а каждый операнд — это функция, возвращающая значение. Однако вопрос в том, как условно выполнить пару функций, ни одна из которых не возвращает значение. - person DavidRR; 29.09.2015

Вы делаете это так

    bool myBool = true;
    bool newBool;
    public void Main()
    {
        MyFunction( newBool = (aFunctionThatReturnsABool == true) ? true: false);
    }

    public void MyFunction (bool aBool)
    {
        // stuff based on the bool
    }

Но что вы на самом деле пытаетесь сделать?

person Winky2222    schedule 23.04.2015
comment
нужно вызывать методы, а не устанавливать переменные - person LastTribunal; 24.04.2015
comment
(aFunctionThatReturnsABool == true) ? true: false точно эквивалентно aFunctionThatReturnsABool, кстати. - person Blorgbeard; 24.04.2015