我为模糊的标题道歉,但我不确定描述它的最佳方式。
我正在SSIS中编写一个C#转换脚本。目标是接受5个小数值,我需要接收5个非空的第一个值,按预定顺序,你可以通过else的顺序看到声明。所以你可以看到我想要获取MM值,如果它有一个,如果不是那么PRE,然后DD,PT等。你也会看到我只是分配一个小的varchar标签值来显示哪个值回来了好。
是否有一种更简洁/更简单的方法,不包括一堆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);
}
答案 0 :(得分:2)
一种可能的方式:
defaultdict(dict,
{'Farm': {u'Red Hat Enterprise Linux for Virtual Datacenters with Smart Management, Premium': 3,
u'Red Hat Enterprise Linux for Virtual Datacenters with Smart Management, Standard': 2}})
您可以创建具有2个属性的匿名类型数组: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 ?? "");
表示小数值,v
表示相应的标签。数组中的项应该是正确的顺序。然后使用n
查找具有非null值的第一个元素。
答案 1 :(得分:0)
这样的东西可能看起来更整洁:
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);
}