Возвратите пустой набор когда Linq где возвраты ничто

Можно использовать объекты вместо переключателей большую часть времени.

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);
6
задан ahsteele 1 December 2009 в 07:26
поделиться

3 ответа

Где возвращает пустую последовательность, если совпадений нет; это совершенно допустимая последовательность (не нулевая). Единственный способ получить нулевое значение - это вызвать 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
7
ответ дан 8 December 2019 в 18:37
поделиться

По умолчанию Enumerable.Where уже возвращает пустой IEnumerable , а не null. Если вы видите «Ссылка на объект не установлена ​​на экземпляр объекта». исключения, скорее всего, проблема в другом.

Может быть, MachineList имеет значение null? Если бы вы его не создавали, вы бы получили это исключение при вызове .Where (...)

4
ответ дан 8 December 2019 в 18:37
поделиться

Кроме того, если вы хотите явно вернуть пустую коллекцию, это может помочь ...

Enumerable.Empty<Machine>();
2
ответ дан 8 December 2019 в 18:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: