Может ли кто-нибудь подумать об элегантном способе уменьшения этого вложенного оператора if-else?

if (Request.QueryString["UseGroups"] != null)
{
  if (Request.QueryString["UseGroups"] == "True")
  {
    report.IncludeGroupFiltering = true;
  }
  else
  {
    report.IncludeGroupFiltering = false;
  }
}
else
{
  report.IncludeGroupFiltering = false;
}

Ответы

Ответ 1

Просто одна проверка:

report.IncludeGroupFiltering = Request.QueryString["UseGroups"] == "True";

Нет необходимости оценивать Request.QueryString["UseGroups"] дважды - он может быть равен только "True", если он не равен null, и сравнение будет отлично работать (и возвращает false), если оно равно null.

Любые решения, все еще выполняющие две операции, слишком усложняют вопросы:)

Ответ 2

report.IncludeGroupFiltering = Request.QueryString["UseGroups"] == "True"

Ответ 3


report.IncludeGroupFiltering = Request.QueryString["UseGroups"] == "True";

Ответ 4

Я думаю, что Request.QueryString["UseGroups"] == "True" и "True" - это только строка, она не ведет себя как bool. Так, вы можете написать в строке

report.IncludeGroupFiltering = string.IsNullOrEmpty(Request.QueryString["UseGroups"])? 
                                false : (Request.QueryString["UseGroups"] == "True");

Ответ 5

report.IncludeGroupFiltering = "True" == Request.QueryString["UseGroups"];

Ответ 6

Измените часть Request.QueryString [ "UseGroups" ], чтобы она поняла, что вы хотите ссылаться на одну и ту же вещь, а затем она становится:

string useGroups = Request.QueryString["UseGroups"];
report.IncludeGroupFiltering = (useGroups != null) && (useGroups == "True");

Ответ 7

 report.IncludeGroupFiltering = (Request.QueryString["UseGroups"] != null) 
                                && (Request.QueryString["UseGroups"] == "True");

Ответ 8

Вы делаете это в основном так, как я. Просто удалите избыточное внутреннее другое:

if(Request.QueryString["USeGroups"] != null)
{
  if(Request.QueryString["UseGroups"] == "True")
    report.IncludeGroupFiltering = true;
}
else report.IncludeGroupFiltering = false;

Ответ 9

Возможно, это:

report.IncludeGroupFiltering = false;
if (Request.QueryString["UseGroups"] == "True")
    report.IncludeGroupFiltering = true;

Ответ 10

Как насчет использования TryParse:

bool includeGroupFiltering;
bool throwaway = Boolean.TryParse(Request.QueryString["UseGroups"], out includeGroupFiltering);
report.IncludeGroupFiltering = includeGroupFiltering;

Ответ 11

Вот как я делаю такой код:

report.IncludeGroupFiltering = false;

if (Request.QueryString["UseGroups"] != null && 
    Request.QueryString["UseGroups"] == "True"       //note that I am not a C# expert - this line /may/ throw an exception if it is indeed null. 
  {
    report.IncludeGroupFiltering = true;
  }

Ответ 12

report.IncludeGroupFiltering = ShouldIncludeGroupFiltering(Request.QueryString["UseGroups"])

private boolean ShouldIncludeGroupFiltering(String queryString) {
    return ("True" == queryString)
}

Ответ 13

Строковые константы неизменяемы и распыляются, они также являются ссылочными объектами. Однако результат Request.QueryString [ "UserGroups" ] является строковой ссылкой (или ссылкой на объект, который может быть неявно преобразован в строку...), который не может быть распылен, поэтому вы не можете просто сравнить ссылки, которые могут быть четными, даже если строки сравниваются.

Оператор == на парах строк не сравнивает ссылки, а содержит содержимое строки. Это означает, что Request.QueryString [ "UserGroups" ] будет разыменован, и это может привести к исключениям разыменования нулевого указателя. Вот почему существует предварительный тест для null (потому что тесты с "reference == null" НЕ разыменовывают ссылку, но фактически проверяют, является ли она нулевой или нет).

Однако существует возможность избежать нулевой проверки: вы можете использовать оператор === только для сравнения ссылки, если результат Request.QueryString [ "Пользовательские группы" ] был распылен (но для этого может потребоваться выделение и хеширование в статическом списке атомов, не очень хорошая идея, если QueryString очень велика.

Итак, лучше всего сначала кэшировать Querystring в локальной строковой переменной и выполнить два теста:

final string queryString; // cache the string value 
if ((queryString = Request.QueryString["UserGroups"]) != null &&
  queryString == "True") {
   ...
} else {
   ...
}

Но учитывая, что тела вашего оператора if/else - это просто сохранить результат условия if(), просто напишите это:

final string queryString; // temporary register caching the non-atomized string reference 
report.IncludeGroupFiltering =
  (queryString = Request.QueryString["UserGroups"]) != null &&
  queryString == "True"; // compares the two strings contents

НО ТОЛЬКО, ЕСЛИ содержимое Request.QueryString [] уже является атомизированными строками, или если их неявное преобразование в строку возвращает атомизированные строки, сохраните строку, сравнивая и используйте === вместо:

final string queryString; // temporary register caching the atomized string reference 
report.IncludeGroupFiltering =
  (queryString = Request.QueryString["UserGroups"]) != null &&
  queryString === "True"; // compares the atomized references

Я не буду предлагать это опасное предположение (более вероятно, что результаты запроса из удаленного источника не будут распыляться по соображениям безопасности/памяти, если только возвращаемое значение уже не было проверено. Учитывая ваш код, я подозреваю, что это выполняет валидацию по возвращаемым значениям из вашего запроса, поэтому результат, скорее всего, не распыляется: основная причина вашего кода заключается в том, чтобы распылить содержимое строки запроса в общее логическое значение, которое позже будет намного легче сравнивать.


Примечание. Я абсолютно не знаю, каков тип значения или ссылки, возвращаемой Request.QueryString [ "UserGroups" ]. Может случиться так, что это объект, реализующий метод "bool operator == (string)", или даже возвращает другой тип, чем bool. Однако сохранение возвращаемого объекта в строковой переменной будет выполнять преобразование в строку, если тип объекта не является нулевым (и если объект совместим, в противном случае вы получите исключение).

Возможно, вы захотите избежать этого преобразования неизвестного объекта, если сам объект может сравниться со строкой типа "Истина", с таким кодом:

report.IncludeGroupFiltering =
  Request.QueryString["UserGroups"] != null &&
  // uses object operator==(string) to compare its contents OR reference.
  Request.QueryString["UserGroups"] == "True";

Все это зависит от того, как вы объявили свойство массива QueryString [] вашего объекта Request, и если содержимое массива может быть полиморфным (различный тип). Если вы знаете, как это объявлено, используйте один и тот же тип для объявления временного окончательного регистра выше, чтобы избежать двойного доступа члена к QueryString из запроса и двойной индексации массива QueryString.

Здесь невозможно узнать, какой код будет лучше для вас, поскольку у нас нет всех объявлений (С# наследует ту же сложность/неопределенность типа, что и С++, со слишком многими неявными преобразованиями и сложными схемами наследования).