Упрощение кода оператора if

96
12 августа 2019, 14:20

Есть такой код на C#. Можно ли его как-то упростить и привести к однострочному виду, т.е. избавиться от конструкции if..else?

 if (String.Equals(path, pattern))
 {
     return true;
 }
 else
 {
     Console.WriteLine("Text");
     return false;
 }
Answer 1

Не вижу большого смысла, но может быть так:

    public static bool function(string path, string pattern)
    {
        return String.Equals(path, pattern) ? true : sayTextAndReturnFalse("Text");
    }
    public static bool sayTextAndReturnFalse(string text)
    {
        Console.WriteLine(text);
        return false;
    }
Answer 2
static T ActionAndReturn<T>(T value, params (T value, Action action)[] actions)
{
    actions.FirstOrDefault(a => EqualityComparer<T>.Default.Equals(value, a.value)).action?.Invoke();
    return value;
}

Тогда:

return ActionAndReturn(string.Equals(path, pattern), (false, () => Console.Write("Text")));

Следующий шаг — делаем это методом расширения и потом пишем:

return string.Equals(path, pattern).ActionAndReturn((false, () => Console.Write("Text")));

Или, как вариант, выкинуть кортежи и params вообще:

static T ActionAndReturn<T>(this T obj, T value, Action action)
{
    if (EqualityComparer<T>.Default.Equals(obj, value)) action();
    return value;
}

и вместо этого просто наращивать методы:

return string.Equals(path, pattern)
    .ActionAndReturn(false, () => Console.Write("Text"))
    .ActionAndReturn(true, () => logger.log("log"));
Answer 3

Я укоротил свой ответ к более правильному (относительно SRP) варианту :

public static class BoolExtension
{
    public static bool WriteMsgIf(this bool value, bool msgShowInCaseof, string consoleMsg)
    {
        if (value == msgShowInCaseof)
            Console.WriteLine(consoleMsg);
        return value;
    }
}

и тогда ты делаешь вот так:

// выведет сообщение "Test" если они НЕ равны между собой и присвоит в rez значение
var rez = String.Equals(path, pattern).WriteMsgIf(false, "This is the message");
// выведет сообщение "Test" если они равны между собой и присвоит в rez значение
var rez = String.Equals(path, pattern).WriteMsgIf(true, "This is the message");

И, снова таки, обрати внимание как легко читается и воспринимается .WriteMsgIf(true, "This is the message");

Answer 4

На мой взгляд, идеологически правильно не смешивать принт и возвращаемое значение. Так делать не нужно.

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

Или можно из этого сделать класс, например WarningString :)

   public class WarningString {
      private string __pattern = String.Empty;
      public string Pattern
      {
          set
          {
              if (__pattern != value)
              {
                 __pattern = value;
              }
           }
      }
      public string Value
      {
          get
          {
              return __value;
          }
          set
          {
              if (__value != value)
              {
                 __value = value;
              }
              if ((__value != String.Empty) && (!__value.Equals(__pattern)))
              {
                 TestString = false;
                 Console.WriteLine("not tested");
              }
              else
              {
                 TestString = true;
              }
           }
        }
        public bool Test { get; private set; }
   }
   WarningString ws = new WarningString();
   ws.Pattern = "test 1";
   ws.Value = "test 2";
   if (ws.Test)
       Console.WriteLine("Test ok");
READ ALSO
Отключение иконки и клавиши Esc

Отключение иконки и клавиши Esc

Есть персонаж, который в сцене №3 берёт предмет «рычаг» (необходимый в сцене №1), на котором висит скрипт «LeverUpSave»

111
Ошибка Failed to create a assets.ap_package компиляции

Ошибка Failed to create a assets.ap_package компиляции

При компиляции файла выдает ошибку: Failed to create a assetsap_package See the Console for details

131
Ошибка при публикации SQL CRL из Visual Studio

Ошибка при публикации SQL CRL из Visual Studio

Делаю сборку CRL для SQLНеобходимо чтобы она была в режиме UNSAFE

100
Перевести числа

Перевести числа

У меня есть число допустим 12865 мне нужно его перевести в 12,865Тоесть если число больше тысячи переводить его в такой формат, но если число меньше...

131