мне шото кажется не логичным возращать false у All если элементов нет
а чего не true?
вот я ожидал что будет тру, а там чето фолз, а логичнее было бы выкинуть эксепшон, потому что нельяз ответить на такой вопрос одно значно
Я изъездил эту страну вдоль и поперек, общался с умнейшими людьми и я могу вам ручаться в том, что обработка данных является лишь причудой, мода на которую продержится не более года. (с) Эксперт, авторитет и профессионал из 1957 г.
Re: All должен кидать эксепшн на пустой последовательности
Здравствуйте, Barbar1an, Вы писали:
B>мне шото кажется не логичным возращать false у All если элементов нет B>а чего не true? B>вот я ожидал что будет тру, а там чето фолз, а логичнее было бы выкинуть эксепшон, потому что нельяз ответить на такой вопрос одно значно
По матлогике должно быть true.
Ну не все программисты математику знают.
Отрицательный остаток от деления на положительное число — из той же серии.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re: All должен кидать эксепшн на пустой последовательности
Здравствуйте, Barbar1an, Вы писали:
B>мне шото кажется не логичным возращать false у All если элементов нет B>а чего не true? B>вот я ожидал что будет тру, а там чето фолз, а логичнее было бы выкинуть эксепшон, потому что нельяз ответить на такой вопрос одно значно
По мне, exception или возврат "false" было бы слишком запутанным.
Например, мне в функцию приходит объект некого сообщения "MyMessage", у которого есть коллекция объектов с ошибками "IEnumerable<MyError> Errors".
Предположим я могу обработать инстанс "MyMessage" только если в коллекции "Errors" нет ни одной ошибки со статусом "Severe".
Логично было бы написать простой код (пример выдуман для демонстрации кейса, я бы использовал конечно "Any" в подобном случае):
public void ProcessMessage(MyMessage message)
{
if(message.Errors.All(v=>v.ErrorStatus != ErrorStatuses.Severe))
{
//можно обрабатывать сообщение
}
}
То есть мне нужно выразить простую мысль, что я могу продолжать только если нет ошибок со статусом "Severe". Есть там в коллекции другие ошибки, или нет, не важно.
Поэтому "пустая коллекция" это не особый случай — это просто коллекция без элементов. Если тебе важно, чтобы там что-то было, то нужно проверять отдельно.
Если .NET в таких случаях начнет бросаться exception-ами или возвращать False, то это был бы сплошной mess.
В сложившихся условиях ни то, ни другое не сулило ему никакой выгоды. Чего не скажешь о молчании...
Здравствуйте, Barbar1an, Вы писали:
B>мне шото кажется не логичным возращать false у All если элементов нет B>а чего не true? B>вот я ожидал что будет тру, а там чето фолз
Здравствуйте, Barbar1an, Вы писали:
B>вот я ожидал что будет тру, а там чето фолз, а логичнее было бы выкинуть эксепшон, потому что нельяз ответить на такой вопрос одно значно
Отчего ж нельяз?
Тут всё просто.
Основной инвариант для All — это c1.Concat(c2).All(p) == c1.All(p) && c2.All(p) для любых совместимых c1 и с2 и любого p.
А поскольку для любой коллекции выполняется c.SequenceEquals(c.Concat(e)), где e — пустая коллекция подходяшего типа, то должно выполняться и такое:
c.All(p) == c.All(p) && e.All(p)
Отсюда сразу понятно, что единственным подходящим решением для e.All(p) является true.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re: All должен кидать эксепшн на пустой последовательности
S>Отсюда сразу понятно, что единственным подходящим решением для e.All(p) является true.
Понятно, но не сразу, и чисто логически не совсем очевидно.
Вот например, можно ли ответить — "да" на вопрос, во всех ли стаканах больше 100 мл, если стаканов вообще нет?
new List<int>().All(ml => ml > 100); // <- true
Поэтому сей вопрос периодически задают с момента появления LINQ (FW 3.5).
P.S. Откуда у автора взялся false, отдельный вопрос.