奇怪的是,有一种更简单的方法可以在一行中写入它而不必两次引用节点吗?我发现自己在解析中做了很多这些。
lidID.idCountry = (passportnode.Descendants("COUNTRY").First().Value != String.Empty) ?
passportnode.Descendants("COUNTRY").First().Value :
"NONE"
或者是为值创建临时变量的最简单方法吗?
答案 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";