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

时间:2013-08-06 17:19:49

标签: c# ternary

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

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

或者是为值创建临时变量的最简单方法吗?

4 个答案:

答案 0 :(得分:6)

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

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

请注意,临时值仍然存在 - 它是ReplaceEmptyWith方法的第一个参数。

现在您可以按如下方式简化代码:

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

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");

答案 3 :(得分:-1)

不完全是你想要的,但是最近的命中是?? operator。它完全符合您的要求,但仅检查空值,而不是空白。

您的代码将是:

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