Упрощение троичного оператора: удаление повторения

Любопытно, есть ли более короткий способ записать это в одну строку без необходимости ссылаться на узел дважды? Я часто делаю это при разборе.

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

или это самый простой способ сделать временную переменную для значения?

4 ответа

Решение

Хотя для этого вам нужна временная переменная, вы можете скрыть ее, определив метод расширения:

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

Обратите внимание, что временное еще есть - это первый аргумент 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;
}

Не совсем то, что вы искали, но близкий хит это ?? оператор. Он делает именно то, что вы ищете, но проверяет только на нули, а не на пустоту.

Ваш код будет:

lidID.idCountry = passportnode.Descendants("COUNTRY").First().Value ?? "NONE";
Другие вопросы по тегам