Я пытаюсь изучить C# на выходных и выполняю 15 упражнений, найденных здесь: http://www.jobsnake.com/seek/articles/index.cgi?openarticle&8533
Вчера я задал аналогичный вопрос для последовательности Фибоначчи и получил отличные ответы, которые познакомили меня с элементами C#, с которыми я раньше не сталкивался: Рефакторинг алгоритма Фибоначчи
Сегодня я хотел бы увидеть, как джедай C# реорганизует следующий код:
static string Reynolds(int d, int v, int rho, int mu)
{
int number = (d*v*rho) / mu;
if (number < 2100) return "Laminar Flow";
else if (number < 2100 && number < 4000) return "Transient Flow";
else return "Turbulent Flow";
}
Так проще, чем вчера, но есть ли хороший способ справиться с множеством условных выражений?
С уважением,
Крис





Используя тернарный оператор C#,
static string Reynolds(int d, int v, int rho, int mu)
{
int number = (d*v*rho) / mu;
return number < 2100? "Laminar Flow":
number >= 4000? "Turbulent Flow":
"Transient Flow";
}
или (чтобы дать моей саркастической стороне немного свободы), если вы обнаружите, что это не удобочитаемый, вы можете добавить комментарии, чтобы сделать его более читаемым,
static string Reynolds(int d, int v, int rho, int mu)
{
int number = (d*v*rho) / mu;
return /*IF*/ number < 2100? /*Then*/ "Laminar Flow":
/*IF*/ number >= 4000? /*Then*/ "Turbulent Flow":
/*Else*/ "Transient Flow";
}
Кто-нибудь действительно думает, что это помогает?
Это компактно, но не очень читаемо. Хотя он этого не просил. :)
Крик ick ick. Связанные тройки == дьявол.
Это как раз тот пример функционального программирования, который можно увидеть в OCaml или Haskell. Почему бы не писать на C#?
Не думаю, что комментарии сделают его более читабельным. Неплохое решение. Это предпочтение стиля. Я предпочитаю иметь вложенные if, иногда я могу решить, что хочу добавить дополнительный код. Я, конечно, использую троичные, редко использую вложенные троичные.
Я думаю, что в вашем коде есть ошибка, но я сделал предположение. Ваше второе «если» никогда не будет оценивать дерево, поскольку число <2000 уже делает первую ветвь истинной.
Я бы создал ENUM:
enum FlowType
{
Laminar
, Transient
, Turbulent
};
static FlowType Reynolds(int d, int v, int rho, int mu)
{
int n = (d*v*rho) / mu;
if (n < 2000)
{
return FlowType.Laminar;
}
else if (n < 4000)
{
return FlowType.Transient;
}
else
{
return FlowType.Turbulent;
}
}
«N> = 2000» является избыточным, вы можете опустить его без изменения семантики кода.
Как указано в коде, вам нужно изменить тип возвращаемого значения. Вы закодировали метод так, как если бы вы возвращали значения типа FlowType, но в сигнатуре метода указано, что вы возвращаете строки. Также нет необходимости в тесте n> = 2000.
Я был в перерывах между редакциями. Кроме того, что касается необязательной проверки> = 2000, проблема заключалась в том, что в оригинале была ошибка, которую забыли удалить при исправлении оригинала.
Вам следует изменить параметры на двойные, поскольку большинство физических значений являются действительными числами. Ваш else if должен проверять число> = 2100, поскольку, если "число <2100" ложно, то "число> = 2100" истинно. Другими словами, вам нужно проверить, находится ли число от 2100 до 4000, или 2100 <= число <4000.