下面的代码有一个函数:
public void func()
{
if (!string.IsNullOrEmpty(customerpay) && !string.IsNullOrEmpty(warrantypay) && !string.IsNullOrEmpty(maintanceplan))
{
if (customerpay == "Include" && warrantypay == "Include" && maintanceplan == "Include")
{
transactiontype = "," + "[Population].[Transaction Type Code].&[C^W^I]";
}
else if (customerpay == "Include" && warrantypay == "Include" && maintanceplan != "Include")
{
transactiontype = "," + "[Population].[Transaction Type Code].&[C^W]";
}
else if (customerpay == "Include" && warrantypay != "Include" && maintanceplan != "Include")
{
transactiontype = "," + "[Population].[Transaction Type Code].&[C]";
}
else if (customerpay != "Include" && warrantypay == "Include" && maintanceplan == "Include")
{
transactiontype = "," + "[Population].[Transaction Type Code].&[W^I]";
}
else if (customerpay != "Include" && warrantypay != "Include" && maintanceplan == "Include")
{
transactiontype = "," + "[Population].[Transaction Type Code].&[I]";
}
else if (customerpay != "Include" && warrantypay == "Include" && maintanceplan != "Include")
{
transactiontype = "," + "[Population].[Transaction Type Code].&[W]";
}
else if (customerpay == "Include" && warrantypay != "Include" && maintanceplan == "Include")
{
transactiontype = "," + "[Population].[Transaction Type Code].&[C^I]";
}
}
}
我需要简化上面的if
-else
C#代码。有办法这样做吗?
发布于 2014-01-27 17:55:09
你可以这样做:
public void func()
{
if (string.IsNullOrEmpty(customerpay) || string.IsNullOrEmpty(warrantypay) || string.IsNullOrEmpty(maintanceplan))
return;
if (customerpay != "Include" && warrantypay != "Include" && maintanceplan != "Include")
return;
List<char> parts = new List<char>();
if (customerpay == "Include")
parts.Add("C");
if (warrantypay == "Include")
parts.Add("W");
if (maintanceplan == "Include")
parts.Add("I");
transactiontype = ",[Population].[Transaction Type Code].&[" + string.Join("^", parts) + "]";
}
首先,如果任何字符串是空的,我们就返回;通过反转逻辑,我们可以减少一个缩进级别,从而使代码变得非常复杂。我们还返回原始代码中没有处理的单个情况:如果所有三个字符串都不是"Include"
。
在那之后,一旦你找到你的字符串的模式,就很容易了。结果字符串中唯一变化的部分在末尾的括号中。有三个可能的字符:C
、W
和I
。如果对应的字符串等于"Include"
,则它们将出现。字符由^
分隔。因此,我们只需单独检查每个条件,并将字符收集到一个列表中。然后加入分离字符,生成最终的结果字符串。
发布于 2014-01-27 17:56:47
第一种情况可以逆转,立即降低筑巢水平:
if (string.IsNullOrEmpty(customerpay) || string.IsNullOrEmpty(warrantypay) || string.IsNullOrEmpty(maintanceplan))
{
return;
}
// rest of conditions
这段代码看起来像示例代码,但我还是要说:func
对于任何函数来说都是一个不好的名称,特别是返回void
的函数。为了遵循命名C#约定,应该将其命名为Func
--但这与框架的Func<T>
冲突,使其更加混乱。给出有意义的名字!!
回到else if
块..。
此代码构建一个string
。我认为transactionType
应该是transactionTypeBuilder
,并且应该是StringBuilder
类型--不要像那样连接字符串,而是构建它们!
此外,每个分支实际上都是要添加到字符串的最后一部分,因此,如果您引入了一个变量并将transactionType
赋值更改为以下内容,那么很容易理解代码所做的事情:
transactionType = string.Format(",[Population].[Transaction Type Code].&[{0}]", code);
其中code
是每个分支试图解决的问题。这给你留下了这样的印象:
var code = string.Empty;
if (customerpay == "Include" && warrantypay == "Include" && maintanceplan == "Include")
{
code = "C^W^I";
}
else if (customerpay == "Include" && warrantypay == "Include" && maintanceplan != "Include")
{
code = "C^W";
}
else if (customerpay == "Include" && warrantypay != "Include" && maintanceplan != "Include")
{
code = "C";
}
else if (customerpay != "Include" && warrantypay == "Include" && maintanceplan == "Include")
{
code = "W^I";
}
else if (customerpay != "Include" && warrantypay != "Include" && maintanceplan == "Include")
{
code = "I";
}
else if (customerpay != "Include" && warrantypay == "Include" && maintanceplan != "Include")
{
code = W";
}
else if (customerpay == "Include" && warrantypay != "Include" && maintanceplan == "Include")
{
code = "C^I";
}
现在,每个测试似乎都在为bool
而哭泣。考虑到这一点:
var code = string.Empty;
var includeCustomerPay = (customerPay == "Include");
var includeWarrantyPay = (warrantyPay == "Include");
var includeMaintenancePlan = (maintenancePlan == "Include");
if (includeCustomerPay && includeWarrantyPay && includeMaintancePlan)
{
code = "C^W^I";
}
else if (includeCustomerPay && includeWarrantyPay && !includeMaintancePlan
{
code = "C^W";
}
else if (includeCustomerPay && !includeWarrantyPay && !includeMaintancePlan)
{
code = "C";
}
else if (!includeCustomerPay && includeWarrantyPay && includeMaintancePlan)
{
code = "W^I";
}
else if (!includeCustomerPay && !includeWarrantyPay && includeMaintancePlan)
{
code = "I";
}
else if (!includeCustomerPay && includeWarrantyPay && !includeMaintancePlan)
{
code = "W";
}
else if (includeCustomerPay && !includeWarrantyPay && includeMaintancePlan)
{
code = "C^I";
}
不是开始有什么东西出现了吗?每个bool
的“代码”总是按相同的顺序排列,并由一个"^"
隔开。
因此,在一点林克的帮助下,可以删除整个条件:
var codes = new[]
{
includeCustomerPay ? "C" : string.Empty,
includeWarrantyPay ? "W" : string.Empty,
includeMaintenancePlan ? "I" : string.Empty
};
var code = string.Join("^", codes.Where(c => !string.IsNullOrEmpty));
transactionType = string.Format(",[Population].[Transaction Type Code].&[{0}]", code);
https://codereview.stackexchange.com/questions/40178
复制相似问题