Почему IQueryable.All () возвращает true в пустой коллекции? - PullRequest
45 голосов
/ 03 февраля 2010

Итак, сегодня я столкнулся с ситуацией, когда некоторый производственный код дал сбой именно потому, что метод выполнялся точно так же, как , документированный в MSDN . Позор мне, что я не читал документацию. Тем не менее, я до сих пор ломаю голову над , почему ведет себя так, даже если «нарочно», так как это поведение в точности противоположно тому, что я ожидал (и другие известные способы поведения), и поэтому похоже, нарушает принцип наименьшего удивления.

Метод All() позволяет предоставить предикат (например, лямбда-выражение) для проверки IQueryable, возвращая логическое значение, которое указывает, соответствуют ли все члены коллекции тесту. Все идет нормально. Вот где это становится странным. All() также возвращает true, если коллекция пуста. Это кажется мне совершенно отсталым по следующим причинам:

  • Если коллекция пуста, такой тест в лучшем случае не определен. Если моя дорога пуста, я не могу утверждать, что все машины, припаркованные там, красные. При таком поведении на пустой подъездной дороге все припаркованные автомобили обозначены красным И синим И шахматной доской - все эти выражения вернут истину.
  • Для тех, кто знаком с понятием SQL, что NULL! = NULL, это неожиданное поведение.
  • Метод Any() ведет себя так, как ожидается, и (правильно) возвращает значение false, поскольку в нем нет элементов, соответствующих предикату.

Итак, мой вопрос: почему All() ведет себя так? Какую проблему это решает? Это нарушает принцип наименьшего удивления?

Я пометил этот вопрос как .NET 3.5, хотя поведение также относится и к .NET 4.0.

РЕДАКТИРОВАТЬ Хорошо, поэтому я понимаю логический аспект этого, как это отлично изложено Джейсоном и остальными вами. По общему признанию, пустая коллекция является чем-то вроде крайнего случая. Я предполагаю, что мой вопрос коренится в борьбе, которая, просто потому что что-то является логичным , не означает, что это обязательно имеет смысл , если вы не в правильном настроении.

Ответы [ 11 ]

0 голосов
/ 03 февраля 2010

False означает, что запрос не дал результатов даже без предиката. Это просто неполный способ указать, что Дестед опубликовал, когда я печатал это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...