三元运算符简化:删除重复

本文关键字:删除 运算符 三元 | 更新日期: 2023-09-27 18:26:35

奇怪的是,有没有一种更短的方法可以在一行中写入,而不必引用节点两次?我发现自己在解析中做了很多这样的事情。

lidID.idCountry = (passportnode.Descendants("COUNTRY").First().Value != String.Empty) ?
                      passportnode.Descendants("COUNTRY").First().Value :
                      "NONE"

还是为该值创建一个临时变量的最简单方法?

三元运算符简化:删除重复

尽管您需要一个临时变量,但您可以通过定义一个扩展方法来隐藏它:

public static ReplaceEmptyWith(this string original, string replacement) {
    return !string.IsNullOrEmpty(original) ? original : replacement;
}

请注意,temporary仍然存在——它是ReplaceEmptyWith方法的第一个参数。

现在你可以简化你的代码如下:

lidID.idCountry = passportnode
    .Descendants("COUNTRY")
    .First()
    .Value
    .ReplaceEmptyWith("NONE");

最简单的方法是使用一个临时变量,如下所示:

var firstDescendantValue = passportnode.Descendants("COUNTRY").First().Value;
lidID.idCountry = firstDescendantValue != "" ? firstDescendantValue : "NONE";

然而,如果你真的想要一个一行,方法时间!

public SelfReturnIfTrue<T>(T source, Func<T, bool> predicate, T falseVal)
{
    return predicate(source) ? source : falseVal;
}

然后你可以这样使用它:

lidID.idCountry = SelfReturnIfTrue(passportnode.Descendants("COUNTRY").First().Value, string.IsNullOrEmpty, "NONE");

我认为临时变量是解决这个问题的简单方法,或者创建一个函数来处理它,比如:

string GetValueIfValid(string s){
    return string.IsNullOrEmpty(s) ? "NONE" : s;
}