任何人都可以想到一种减少这种嵌套的if-else语句的优雅方法吗?

时间:2010-07-30 20:01:57

标签: c#

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

13 个答案:

答案 0 :(得分:47)

只需一张支票:

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

没有必要对Request.QueryString["UseGroups"]进行两次评估 - 如果它是非空的,它只能等于“True”,如果是,那么比较将完美地运行(并返回false) em> null。

任何仍在进行两项操作的解决方案都会使问题过于复杂:)

答案 1 :(得分:21)

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

答案 2 :(得分:14)

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

答案 3 :(得分:3)

我认为Request.QueryString["UseGroups"] == "True"和“True”只是一个字符串,它的行为不像bool。 所以, 你可以写一行

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

答案 4 :(得分:2)

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

答案 5 :(得分:1)

将Request.QueryString [“UseGroups”]部分分解为明确表示你要引用相同的东西,然后变为:

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

你基本上就是这样做的。只需删除冗余的内部其他内容:

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

答案 8 :(得分:0)

也许这个:

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

答案 9 :(得分:0)

使用TryParse怎么样:

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

答案 10 :(得分:0)

这就是我这样做的代码:

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;
  }

答案 11 :(得分:0)

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

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

答案 12 :(得分:-1)

字符串常量是不可变的和雾化的,它们也是引用对象。但是,Request.QueryString [“UserGroups”]的结果是一个字符串引用(或对可能隐式转换为字符串的对象的引用...)可能没有被雾化,所以你不能只是比较可能的引用即使字符串相等也是不同的。

字符串对上的==运算符不是比较引用而是比较字符串内容。这意味着将取消引用Request.QueryString [“UserGroups”],这可能会导致空指针解除引用异常。这就是为什么有一个null的先前测试(因为带有“reference == null”的测试不是取消引用引用,而是实际检查它是否为null)。

然而,有可能避免空检查:如果Request.QueryString [“Usergroups”]的结果已被雾化,您可以使用===运算符来比较引用(但它可能需要分配和散列在静态的原子列表中,如果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。如果对象的类型不为null,则将返回的对象存储在字符串变量中将执行其转换为字符串(如果对象是兼容的,否则您将获得异常)。

如果对象本身可以与“True”之类的字符串进行比较,您可能希望避免对未知对象进行此转换,代码如下:

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

所有这些取决于您如何声明Request对象的QueryString []数组属性,以及数组内容是否可以是多态的(变化类型)。如果您知道它是如何声明的,那么使用完全相同的类型来声明上面的临时final寄存器,以避免从Request获取对QueryString的双成员访问,以及对QueryString数组进行双重索引。

在这里,我们不可能知道哪个代码对你最好,因为我们没有所有的声明(C#继承了与C ++相同的类型复杂性/歧义,有太多的隐式转换和复杂的继承方案)。 / p>