Есть такой код на C#. Можно ли его как-то упростить и привести к однострочному виду, т.е. избавиться от конструкции if..else?
if (String.Equals(path, pattern))
{
return true;
}
else
{
Console.WriteLine("Text");
return false;
}
Не вижу большого смысла, но может быть так:
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;
}
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"));
Я укоротил свой ответ к более правильному (относительно 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");
На мой взгляд, идеологически правильно не смешивать принт и возвращаемое значение. Так делать не нужно.
Получайте значение и по нему принимайте действия, по месту, в функции которая вызывала результат.
Или можно из этого сделать класс, например 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");
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Есть персонаж, который в сцене №3 берёт предмет «рычаг» (необходимый в сцене №1), на котором висит скрипт «LeverUpSave»
При компиляции файла выдает ошибку: Failed to create a assetsap_package See the Console for details
Делаю сборку CRL для SQLНеобходимо чтобы она была в режиме UNSAFE
У меня есть число допустим 12865 мне нужно его перевести в 12,865Тоесть если число больше тысячи переводить его в такой формат, но если число меньше...