All должен кидать эксепшн на пустой последовательности
От: Barbar1an Украина  
Дата: 17.11.23 18:07
Оценка:
мне шото кажется не логичным возращать false у All если элементов нет
а чего не true?
вот я ожидал что будет тру, а там чето фолз, а логичнее было бы выкинуть эксепшон, потому что нельяз ответить на такой вопрос одно значно
Я изъездил эту страну вдоль и поперек, общался с умнейшими людьми и я могу вам ручаться в том, что обработка данных является лишь причудой, мода на которую продержится не более года. (с) Эксперт, авторитет и профессионал из 1957 г.
Re: All должен кидать эксепшн на пустой последовательности
От: T4r4sB Россия  
Дата: 17.11.23 18:30
Оценка: +1
Здравствуйте, Barbar1an, Вы писали:

B>мне шото кажется не логичным возращать false у All если элементов нет

B>а чего не true?
B>вот я ожидал что будет тру, а там чето фолз, а логичнее было бы выкинуть эксепшон, потому что нельяз ответить на такой вопрос одно значно

По матлогике должно быть true.
Ну не все программисты математику знают.
Отрицательный остаток от деления на положительное число — из той же серии.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re: All должен кидать эксепшн на пустой последовательности
От: DreamWeaver ОАЭ  
Дата: 17.11.23 18:32
Оценка:
Здравствуйте, 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.
В сложившихся условиях ни то, ни другое не сулило ему никакой выгоды. Чего не скажешь о молчании...
Отредактировано 17.11.2023 19:10 DreamWeaver . Предыдущая версия .
Re: All должен кидать эксепшн на пустой последовательности
От: rameel https://github.com/rsdn/CodeJam
Дата: 17.11.23 19:05
Оценка: +4
Здравствуйте, Barbar1an, Вы писали:

B>мне шото кажется не логичным возращать false у All если элементов нет

B>а чего не true?
B>вот я ожидал что будет тру, а там чето фолз

Так там true и возвращается. Откуда false?

https://source.dot.net/#System.Linq/System/Linq/AnyAll.cs,66

public static bool All<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
    if (source == null)
    {
        ThrowHelper.ThrowArgumentNullException(ExceptionArgument.source);
    }

    if (predicate == null)
    {
        ThrowHelper.ThrowArgumentNullException(ExceptionArgument.predicate);
    }

    foreach (TSource element in source)
    {
        if (!predicate(element))
        {
            return false;
        }
    }

    return true;
}


B>а логичнее было бы выкинуть эксепшон, потому что нельяз ответить на такой вопрос одно значно


Вот это как раз было бы не логично
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re: All должен кидать эксепшн на пустой последовательности
От: Sinclair Россия https://github.com/evilguest/
Дата: 18.11.23 10:27
Оценка: 5 (2)
Здравствуйте, 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 должен кидать эксепшн на пустой последовательности
От: sergii.p  
Дата: 20.11.23 11:08
Оценка:
Здравствуйте, Barbar1an, Вы писали:

B>логичнее было бы выкинуть эксепшон, потому что нельяз ответить на такой вопрос одно значно


кажется что try/catch усложнит код

return list.Empty() ? false : list.All(...);


или

try { return list.All(...); } catch(...) { return false; }
Re[2]: All должен кидать эксепшн на пустой последовательности
От: 4058  
Дата: 21.11.23 14:00
Оценка: +1
Здравствуйте, Sinclair, Вы писали:

S>
S>c.All(p) == c.All(p) && e.All(p)
S>

S>Отсюда сразу понятно, что единственным подходящим решением для e.All(p) является true.

Понятно, но не сразу, и чисто логически не совсем очевидно.
Вот например, можно ли ответить — "да" на вопрос, во всех ли стаканах больше 100 мл, если стаканов вообще нет?

new List<int>().All(ml => ml > 100); // <- true

Поэтому сей вопрос периодически задают с момента появления LINQ (FW 3.5).

P.S. Откуда у автора взялся false, отдельный вопрос.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.