C# 替代一堆基于层次结构的 else if 语句
C# alternative to a bunch of else if statements based on hierarchy
对于模糊的标题,我深表歉意,但我不确定描述它的最佳方式。
我正在 SSIS 中编写 C# 转换脚本。目标是接收 5 个小数值,我需要接收 5 个非空值中的第一个值,按预定顺序,如您所见的顺序else if 语句。因此,正如您所看到的,我想获取 MM 值(如果它有一个值),如果没有,则获取 PRE,然后是 DD、PT 等。您还会看到,我只是分配了一个小的 varchar 标签值来显示哪个值返回为嗯
是否有 cleaner/easier 不包含一堆 if/else if 块的方法?我只是想清理一下。
当前代码如下(感谢任何建议!):
public Tuple<decimal?,string> getCurrentRec(Decimal? PT, Decimal? DD,
Decimal? PRE, Decimal? MM)
{
string ptlabel = "PT";
string ddlabel = "DD";
string prelabel = "PRE";
string MMLabel = "MM";
string curlabel;
decimal? currentval;
if (MM.HasValue)
{
curlabel = MMLabel;
currentval = MM.Value;
}
else if (PRE.HasValue)
{
curlabel = prelabel;
currentval = PRE.Value;
}
else if (DD.HasValue)
{
curlabel = ddlabel;
currentval = DD.Value;
}
else if (PA.HasValue)
{
curlabel = ptlabel;
currentval = PT.Value;
}
else
{
curlabel = "";
currentval = (decimal?)null;
}
return Tuple.Create(currentval, curlabel);
}
一种可能的方式:
var match = new[] {
new {v = MM, n = nameof(MM) },
new {v = PRE, n = nameof(PRE) },
new {v = DD, n = nameof(DD) },
new {v = PT, n = nameof(PT) },
}.FirstOrDefault(c => c.v != null);
return Tuple.Create(match?.v, match?.n ?? "");
您创建了具有 2 个属性的匿名类型数组:v
用于小数点的值,n
用于相应的标签。数组中的项目应该以正确的顺序排列。然后使用 FirstOrDefault
查找具有非空值的第一个元素。
这样的东西可能看起来更整洁:
public Tuple<decimal?,string> evaluate(Decimal? d, string s)
{
if (!d.HasValue)
return null;
return Tuple.Create(d, s);
}
public Tuple<decimal?,string> getCurrentRec(Decimal? PT, Decimal? DD, Decimal? PRE, Decimal? MM)
{
return evaluate(PT, "PT")
?? evaluate(DD, "DD")
?? evaluate(PRE, "PRE")
?? evaluate(MM, "MM")
?? Tuple.Create(null, null);
}
对于模糊的标题,我深表歉意,但我不确定描述它的最佳方式。
我正在 SSIS 中编写 C# 转换脚本。目标是接收 5 个小数值,我需要接收 5 个非空值中的第一个值,按预定顺序,如您所见的顺序else if 语句。因此,正如您所看到的,我想获取 MM 值(如果它有一个值),如果没有,则获取 PRE,然后是 DD、PT 等。您还会看到,我只是分配了一个小的 varchar 标签值来显示哪个值返回为嗯
是否有 cleaner/easier 不包含一堆 if/else if 块的方法?我只是想清理一下。
当前代码如下(感谢任何建议!):
public Tuple<decimal?,string> getCurrentRec(Decimal? PT, Decimal? DD,
Decimal? PRE, Decimal? MM)
{
string ptlabel = "PT";
string ddlabel = "DD";
string prelabel = "PRE";
string MMLabel = "MM";
string curlabel;
decimal? currentval;
if (MM.HasValue)
{
curlabel = MMLabel;
currentval = MM.Value;
}
else if (PRE.HasValue)
{
curlabel = prelabel;
currentval = PRE.Value;
}
else if (DD.HasValue)
{
curlabel = ddlabel;
currentval = DD.Value;
}
else if (PA.HasValue)
{
curlabel = ptlabel;
currentval = PT.Value;
}
else
{
curlabel = "";
currentval = (decimal?)null;
}
return Tuple.Create(currentval, curlabel);
}
一种可能的方式:
var match = new[] {
new {v = MM, n = nameof(MM) },
new {v = PRE, n = nameof(PRE) },
new {v = DD, n = nameof(DD) },
new {v = PT, n = nameof(PT) },
}.FirstOrDefault(c => c.v != null);
return Tuple.Create(match?.v, match?.n ?? "");
您创建了具有 2 个属性的匿名类型数组:v
用于小数点的值,n
用于相应的标签。数组中的项目应该以正确的顺序排列。然后使用 FirstOrDefault
查找具有非空值的第一个元素。
这样的东西可能看起来更整洁:
public Tuple<decimal?,string> evaluate(Decimal? d, string s)
{
if (!d.HasValue)
return null;
return Tuple.Create(d, s);
}
public Tuple<decimal?,string> getCurrentRec(Decimal? PT, Decimal? DD, Decimal? PRE, Decimal? MM)
{
return evaluate(PT, "PT")
?? evaluate(DD, "DD")
?? evaluate(PRE, "PRE")
?? evaluate(MM, "MM")
?? Tuple.Create(null, null);
}