C#替代一堆基于层次结构的if语句

时间:2018-02-15 15:10:53

标签: c# visual-studio-2015 ssis-2016

我为模糊的标题道歉,但我不确定描述它的最佳方式。

我正在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);
}

2 个答案:

答案 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);
}
相关问题