Упрощение троичного оператора: удаление повторения
Любопытно, есть ли более короткий способ записать это в одну строку без необходимости ссылаться на узел дважды? Я часто делаю это при разборе.
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;
}