2

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

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

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

4

3 回答 3

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");
于 2013-08-06T17:24:19.800 回答
1

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

string GetValueIfValid(string s){
    return string.IsNullOrEmpty(s) ? "NONE" : s;
}
于 2013-08-06T17:21:52.577 回答
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");
于 2013-08-06T17:25:24.027 回答