Можно использовать объекты вместо переключателей большую часть времени.
function getInnerText(o){
return o === null? null : {
string: o,
array: o.map(getInnerText).join(""),
object:getInnerText(o["childNodes"])
}[typeis(o)];
}
Обновление: если Вы обеспокоены случаями, оценивающими заранее быть неэффективным (почему Вы волнуетесь по поводу эффективности это вначале в дизайне программы??) затем можно сделать что-то вроде этого:
function getInnerText(o){
return o === null? null : {
string: function() { return o;},
array: function() { return o.map(getInnerText).join(""); },
object: function () { return getInnerText(o["childNodes"]; ) }
}[typeis(o)]();
}
Это более обременительно, чтобы ввести (или читать) или, чем переключатель или, чем объект, но он сохраняет преимущества использования объекта вместо переключателя, детализированного в разделе комментариев ниже. Этот стиль также делает это более простым для затягивания этого в надлежащий "класс", после того как это растет достаточно.
update2: с предложенными расширениями синтаксиса для ES.next это становится
let getInnerText = o -> ({
string: o -> o,
array: o -> o.map(getInnerText).join(""),
object: o -> getInnerText(o["childNodes"])
}[ typeis o ] || (->null) )(o);
Где
возвращает пустую последовательность, если совпадений нет; это совершенно допустимая последовательность (не нулевая). Единственный способ получить нулевое значение - это вызвать FirstOrDefault
или SingleOrDefault
.
Вы уверены, что ошибка именно там, где вы думаете?
int?[] nums = { 1, 3, 5 };
var qry = nums.Where(i => i % 2 == 0);
Console.WriteLine(qry == null); // false
Console.WriteLine(qry.Count()); // 0
var list = qry.ToList();
Console.WriteLine(list.Count); // 0
var first = qry.FirstOrDefault();
Console.WriteLine(first == null); // true
По умолчанию Enumerable.Where уже возвращает пустой IEnumerable
, а не null. Если вы видите «Ссылка на объект не установлена на экземпляр объекта». исключения, скорее всего, проблема в другом.
Может быть, MachineList имеет значение null? Если бы вы его не создавали, вы бы получили это исключение при вызове .Where (...)
Кроме того, если вы хотите явно вернуть пустую коллекцию, это может помочь ...
Enumerable.Empty<Machine>();