3

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

我正在 SSIS 中编写 C# 转换脚本。目标是接收 5 个小数值,我需要按照预先确定的顺序接收 5 个非空值中的第一个值,正如您可以通过 else if 语句的顺序看到的那样。因此,如您所见,如果有 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);
}
4

2 回答 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 ?? "");

您创建具有 2 个属性的匿名类型数组:v用于小数点的值和n相应的标签。数组中的项目应按正确顺序排列。然后,您使用FirstOrDefault查找具有非空值的第一个元素。

于 2018-02-15T15:20:20.480 回答
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);
}
于 2018-02-15T15:29:05.353 回答