1. C# / Говнокод #9201

    +121

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    private List<string> _items
    
    ...				
    
    if (_items.Count <= 0)
        return;

    Запостил: Alx, 23 Января 2012

    Комментарии (94) RSS

    • Сэкономить 100 мс на вызове GetEnumerator().MoveNext().Current
      Ответить
      • не вижу экономии
        Count - это по времени в общем случае O(n)
        if (!_items. GetEnumerator().MoveNext()) - это по времени всегда O(1)
        Ответить
        • не вижу экономии
          Count - это по времени в общем случае O(n)
          if (!_items.Any()) - это по времени всегда O(1)
          хотя count может быть быстрее, если класс, реализующий List<> реализует быстрое свойство Count (например, чтение из переменной класса, а не через подсчет всех элементов), тогда компилятор сможет родить более быстрый код, чем через Any()
          Ответить
        • я, это, не без сарказма, же
          Ответить
          • >я, это, не без сарказма, же
            нужное подчеркнул
            Ответить
            • Good point. I hadn't thuhgot about it quite that way. :)
              Ответить
            • Whoever wrote this, you know how to make a good <a href="http://iopblda.com">arcleit.</a>
              Ответить
            • At last! Something clear I can unsdretand. Thanks! http://jfltzie.com [url=http://weshtwup.com]weshtwup[/url] [link=http://agiqfa.com]agiqfa[/link]
              Ответить
            • It's about time soomene wrote about this. http://zhmhcmln.com [url=http://ocrwpfrgun.com]ocrwpfrgun[/url] [link=http://actsjzymzaa.com]actsjzymzaa[/link]
              Ответить
      • Smart thkniing - a clever way of looking at it.
        Ответить
      • <a href="http://cbfdol.com">Areclits</a> like this just make me want to visit your website even more.
        Ответить
      • Thank God! Somenoe with brains speaks! http://qhgkynspoq.com [url=http://wfpvyphsonz.com]wfpvyphsonz[/url] [link=http://fdhiyapou.com]fdhiyapou[/link]
        Ответить
      • Is that really all there is to it because that'd be flgbneraastibg. http://unpjojxms.com [url=http://yaiaygc.com]yaiaygc[/url] [link=http://qoxablb.com]qoxablb[/link]
        Ответить
    • битрикс-фан детектед
      Ответить
    • Тут можно ещё NullReferenceException схлопотать (особенно при отрицательном кол-ве элементов :)
      Ответить
    • Кеп, в чем говно? А если в ... вызывается метод, наполняющий _items данными?
      Ответить
      • Я тоже не сразу понял. Возможно, в <= 0.
        Ответить
        • Я тоже так часто пишу. Знак меньше для пущей надежности.
          Хотя сейчас подумал, не факт что оно надежней (всякие переполнения, например).
          Ответить
          • переполнения кол-ва элементов в списке? это уже получится что MS налагала
            Ответить
            • Тонкостей шарпа не знаю, но люблю вспоминать сей говнокод: 3117
              Ответить
      • Как бы я так понимаю, что тут два в одном флаконе - проверить наличие элементов в связном списке посчитав его длину - далеко не самый оптимальный вариант. Гораздо менее затратно проверить наличие первого элемента. Но другой интересный момент - List<T>.Count заявлен как Int32 - т.е. знаковый. Что-то Майкрософт замыслил тут недоброе :)
        Ответить
        • >проверить наличие элементов в связном списке посчитав его длину - далеко не самый оптимальный вариант
          Зачастую Listы - обертки над массивами. Там найти длину - быстро.
          И ничего Майкрософт не измышлял. В шарпе индексы этих самых массивов - знаковые.
          И как в вышеприведенном мною ГК из шарпов торчат уши портирования оных с явы.
          В которой все примитивные типы, включая int тоже знаковые.
          Ответить
          • [quote]Retrieving the value of this property is an O(1) operation.[/quote]
            Хех, почитал msdn - чет новое узнал. Да, вобщем, не список это. Так же как в Яве, одно ни к чему не обязывающее название... вообще не понятно, зачем он тогда такой нужен, если есть Array. :)
            Ответить
            • Никто не запрещает дополнительно хранить текущий размер списка.
              Ответить
              • Не, msdn черным по белому напсиано internal array - так что, никакой это не список, вобщем :) Да и если задуматься, и не работает он как список...
                Ответить
                • Обертка над массивом, реализующая соответствующий интерфейс.
                  Стандартный подход.

                  Кстати 6 человек плюсануло. А на мой вопрос
                  >в чем говно?
                  никто ответа не дал.
                  Хм. И снова цифра 6.
                  Ответить
                  • Говно в том, что _items.Count - это количество элементов и в принципе не может быть меньше нуля.
                    Ответить
                    • Ахахах. Дошло. Обосрался со смеху.
                      Ответить
                      • You really saved my skin with this innaomotirf. Thanks!
                        Ответить
                      • Smart <a href="http://tddnnzddyz.com">thiinnkg</a> - a clever way of looking at it.
                        Ответить
                      • Your hosteny is like a beacon http://qflqea.com [url=http://yxfutmldyi.com]yxfutmldyi[/url] [link=http://plpdreeghk.com]plpdreeghk[/link]
                        Ответить
                      • At last some rainitaloty in our little debate. http://lceqyanex.com [url=http://rpsqzr.com]rpsqzr[/url] [link=http://einfmwflphn.com]einfmwflphn[/link]
                        Ответить
                  • Когда вы говорите "стандартный", очень хорошо, когда вы сразу же говорите о каком стандарте идет речь :) Меня в этом подходе удивляет даже больше то, что один класс массива уже есть - зачем создавать еще один с путающим названием мне не понятно. А реализовывать список через массив, ну это примерно как реализовывать крaсный цвет зеленым фломастером.
                    Ответить
                    • Лисп бэкграунд мешает восприятию современых нелогичных языков. Список в Java\C# - это не тот связный список из cons-ячеек. Это всего лишь интерфейс, обязующийся реализовать определённые операции наподобие добавления элемента или получения размера списка. Реализовать его можно по-разному.
                      Интерфейсы позволяют получать "представление" одних коллекций в виде других. Или, например, можно реализовать список, содержащий 100 одинаковых элементов, реально храня лишь один элемент и размер списка, при этом все уже реализованные методы и функции будут для него прекрасно работать.
                      Ответить
                      • Так а при чем тут список, если это массив? Это типа потому, что в Яве так неподумав назвали? Я же не возмущаюсь существованию массивов, меня удивляет то, что предмет назвали абсолютно неподходящим словом. Кроме того, есть еще и массив, который так и называется "массив".
                        Кроме Лиспа списки существуют еще много где... это как бы не эзотерика. И это не вопрос древности, есть задачи которые лучше решаются с использованием списков, есть - массивов. А валить все в одну кучу - это все равно что вережки носками называть.
                        Ответить
                        • В отличие от лиспа, массивы в java (как и в c) имеют постоянный размер, имеют обособленный синтаксис и вообще во многом отличаются от остальных сущностей языка. Списки - это просто некая астрация. Нельзя было назвать это дело "DynamicArray", потому что астракцию "Список" можно реализовать не только с помощью динамического массива. Такая астракция позволяет писать код, который работает со любыми списками, т.е. более общий код.
                          Приведу ещё пример: если вы решите реализовать ленивые списки, элементы которых вычисляются по мере необходимости, можно реализовать абстракцию списка , и вам не придётся писать кучу нового кода с алгоритмами для ленивых списков (как пришлось бы делать в Common Lisp, где нет ISeq абстракции из Clojure). Вы просто можете использовать весь код, потребляющий "Список" в качестве входных данных.
                          Ответить
                          • Абстракцию "Список" никак нельзя реализовать с помощью массива. Ни плохо ни хорошо, это просто не возможно, т.как все равно получится массив, а не список.
                            В CL такая абстракция не нужна - список, как и массив наследуют sequence. Все методы, которые специализируются на sequence будут работать для ленивой реализации, если она будет наследоваться от sequence.
                            Ответить
                            • ISBN 978-5-8459-1610-5
                              Вот в этой книжке люди с воображением реализуют с помощью массива всё что угодно: связные списки, деревья, ассоциативные массивы, етц.
                              Там же можно найти описание АТД "Список", представленного в виде интерфейса в Java/C#.
                              Ответить
                              • Это типа набор способов как приготовить яйцо в микоровлновке? Я не знаю, как именно работает adjustable array потому что справка говорит: Common Lisp provides no portable way to create a non-adjustable array, that is, an array for which adjustable-array-p is guaranteed to be false. Что значит, что каждый волен реализовать по-своему. Но, если честно, я бы просто этого не делал, т.как в этом никокгда нет необходимости, всегда можно найти другой способ добиться того же результата, и сделать то же самое лучше. А искать способы поделить на ноль - ну так это из другой немножко области...
                                Ответить
                                • вы забываете, что всё ваши программы и типы данных в конечном счёте реализованы в виде операций над массивом байтов фиксированного размера, а машинные адреса - всего лишь индексы в этом массиве.
                                  Ответить
                                  • Во-во!
                                    Ответить
                                    • Plienasg to find someone who can think like that
                                      Ответить
                                    • That's not just the best <a href="http://vcflvflvum.com">anewsr.</a> It's the bestest answer!
                                      Ответить
                                    • All of my questions set-kedtthanls! http://bhnbuvtyo.com [url=http://rlaqeglf.com]rlaqeglf[/url] [link=http://twrwcamyuo.com]twrwcamyuo[/link]
                                      Ответить
                                    • In the cocmlipated world we live in, it's good to find simple solutions. http://jawivmjq.com [url=http://ndqzvfzmcc.com]ndqzvfzmcc[/url] [link=http://ixelmw.com]ixelmw[/link]
                                      Ответить
                            • У вас какой бэкграунд?
                              List - это список. Нет, не тот список, что в Лиспе. Просто список! Список элементов, последовательность. Массив - последовательность элементов.
                              Вон в STL C++, то, что в C# называется List, назвали vector. Тоже не соответствует математическому понятию вектора. И ни чо, живём с этим.
                              Ответить
                              • >Тоже не соответствует математическому понятию вектора.
                                в геометрическом смысле - не соответствует, а в алгебраическом - соответствует.
                                Ответить
                            • Пафосный дурачок. Все компьютере ВСЕ данные это массив в конечном итоге. Память компа линейна с точки зрения цпу, это массив
                              Ответить
                          • > астрация
                            http://www.flowerbunker.ru/gorshechnye_rasteniya/katalog/catalog_id=1855.html
                            Ответить
                      • Наверное, правильнее было бы назвать RandomAccessCollection (особенность этих списков — доступ по индексу), но это слишком длинно.

                        List тут не от лисповского списка, а скорее от гуишного ListBox.
                        Ответить
                    • список - это не "связанный список", а динамически-расширяющийся массив
                      Ответить
                      • в .NET есть отдельный LinkedList<T>
                        http://msdn.microsoft.com/en-us/library/he2s3bh7.aspx
                        Ответить
                      • Ну дык, как и в комментарии выше: чего ж его не называли динамическим массивом? Да и почитав немного об этом классе, как-то вообще не понятно зачем такое чудо нужно. Т.е. он сам решает сколько памяти выделить "наперед", а потом, если нужно, будет создавать новый массив и копировать в него старый. Уж лучше самому создать массив нужного размера заранее...
                        Ответить
                        • > Уж лучше самому создать массив нужного размера заранее
                          КО: Нужный размер может быть заранее неизвестен.

                          Ваши слова выдают человека, который никогда не реализовывал списки\динамические массивы\деревья\хэштаблицы ручками на православных Pascal\C\Fortran.
                          Ответить
                          • И К.О. будет создавать каждые Х добавлений по новому массиву? Так он быстро станет капитаном запаса...
                            Ответить
                            • Во-первых, массив каждый раз увеличивается в полтора/два раза, поэтому реаллокация происходит довольно редко.
                              Во-вторых, выбор реализации сильно зависит потребностей конкретной задачи. Добавление в начало массива - ещё более затратная операция, поскольку приходится двигать весь хвост в конец.
                              С другой стороны, обращение по индексу для такого массива будет очень быстрым.
                              Для этого и существуют различные реализации: используйте ту из них, которая наиболее подходит в каждом конкретном случае.
                              Часто читаете/пишете по индексу и редко добавляете в начало? ArrayList. Часто добавляете в начало\середину? LinkedList.
                              В большинстве случаев вполне хватает ArrayList'а. Кроме того, если есть догадки относительно требуемого размера, их можно сообщить конструктору и он изначально выделит достаточно большой буфер.
                              Ответить
                              • Ага, и К.О. для того, чтобы хранить Х + 1 элементов выделит Х * 1.5 памяти? И чего, это вдруг стало хорошим тоном? Типа неиспользуемая память - это так и надо?
                                Ответить
                                • Невозможно написать структуру данных, которая будет наиболее подходящей во всех ситуациях. Искусство программирования в том и заключается, чтобы выбирать наиболее подходящие решения в каждом конкретном случае.
                                  Ответить
                                • > чтобы хранить Х + 1 элементов выделит Х * 1.5 памяти
                                  поэтому в языках, дающих сунуть пальцы сразу в пламенный мотор, массив, который суть непрерывная область памяти, занятая однотипными элементами, реаллоцируется либо сам по себе при вставке в конец (и тут как раз он сам решает, сколько ему приращивать, место под один элемент, или место равное половине существующей длины - может ты следующей операций тоже вставишь), либо не реаллоцируется, т.к. у него пока хватает свободного места - потому что объем этого самого свободного места умный программист сам прикинул и посоветовал массиву
                                  я говорю о reserve в std::vector в c++, и это нормальная практика, когда массив самостоятельно растёт в 1.5 раза, если программист лично не выделил предварительно для него места - значит программиста всё устраивает
                                  Ответить
                                  • Так программист может и не знать. Я вот пока не посмотрел в msdn думал что список выделяет памяти точно столько сколько нужно для хранения содержимого.
                                    Есть логическое противоречие если пытаться заменить друг другом "последовательность", "список" и "массив". Последовательность не обязана быть конечной, может быть цикличной; последовательность не обязана содержать однотипные элементы. Массив - одна из разновидностей последовательности, которая не может быть бесконечной, не может быть цикличной, не может содержать разнородные элементы. Список - это другая разновидность последовательности, которая может быть бесконечной, цикличной и содержать разнородные элементы. Каким бы образом кто бы не использовал массив, нет возможности из него сделать список, т.как либо прийдется задействовать возможности списка для реализации списка (т.е. массив не может быть использован в качестве заменителя), либо все требования не будут соблюдены.
                                    Слово "последовательность" я использую в математическом смысле, например, натуральный ряд это бесконечная последовательность натуральных чисел определенная через дискретную функцию 1+.
                                    Ответить
                                    • зачем ты мне всё это написал?
                                      > Так программист может и не знать
                                      Если программист не знает, значит для использования _массива_ ему нужны веские причины - такие, что минусы неоптимального роста будут приемлемы.
                                      Если программист примерно предполагает конечный размер, он может руками сделать в нужном ему месте vec.reserve(vec.size() + additional) и не полагаться на x1.5 рост. Что есть для этого в дотнет - не знаю.
                                      > Я говорю, что попытка сделать хороший динамический массив никогда не будет успешной. Но мало того, она никогда и не нужна.
                                      В этом ты ошибаешься, иногда требуется одновременно и динамическое расширение, и O(1) для рандомного доступа, и уверенность в последовательном расположении элементов в памяти - например, прием пакета из сети, где конечная длина пакета становится известна только при получении первых N байт.
                                      > вся остальная эзотерика о бесконечных последовательностях на конечных детерминированных железяках у тебя под столом и их именах
                                      чего мне тут комментировать?
                                      Ответить
                                      • Сорри, это не все тебе, просто очень неудобно отвечать, когда ответы не хронологически отсортированы.
                                        По поводу "железяк" - так факт их существования не делает способ по которому они работают правильным... если исходить из наличия фактов, то нужно принять несколько сотен религий как одновременно единственно верных, например.
                                        Кроме того, нет никакой технической сложности в реализации бесконечных (циклических) списков, это не эзотерика никакая... Понажимай на TAB - вот тебе и циклический список...
                                        Для того же примера с пакетами - можно отдельно прочитать заголовок, и отдельно содержание - а не выделять память наугад... как бы странный пример. Да и вообще, принять как данность, что не возможно одновременно O(1) и безразмерная коллекция. А пробовать объять необъятное...
                                        Кроме того, я не правильно изначально записал, не Х * 1.5, а Х * 2.5, т.как "старый" массив - с ним уже особо нечего делать. Т.е. это еще кроме всего остального дефрагментация...
                                        Ответить
                                        • Ты прицепился к росту x1.5, я тебе ответил, что это нормально, это та самая цена за бесконтрольный динамический рост. И несомненно, это лучше, чем выделять память строго на N+1 элементов при росте и реаллоцироваться при каждом добавлении. В зависимости от ситуации, программист обязан взвесить все за и против и обосновать выбор контейнера. Не понравилось с сетевым пакетом (хотя чего сложного массиву один раз реаллоцироваться с K до M элементов по требованию программиста, если ему это нужнее, чем хранить в 2 кусках) - пожалуйста, чтение пользовательского ввода из консоли. Ты не знаешь сколько введет пользователь, у тебя есть выбор вместо vector взять deque, но тогда ты будешь терять время при каждом вызове "ну ка дай мне то, что навводил пользователь, в виде непрерывного массива", вместо того, чтобы терять время на реаллокации. И да, списком хранить посимвольно тут вообще не вариант.
                                          Заявлять, что динамические массивы не нужны, потому что я использую не голову, а абстракции в дотнете, не понимая как они устроены - это неправильно.
                                          Ну и напоследок, АДТ "Список" таки можно выполнить с помощью структуры данных "массив". Каждый элемент хранит { T data, int next_offset }, т.е. хранит номер ячейки следующего элемента, где "-1" - нет следующего элемента. Что имеем - имеем интерфейс "списка", но (плюсы) располагаем все элементы кучно (и тем самым лучше кешируем данные), можем быстро рандомно перебрать все элементы (например, для поиска минимального), и (минусы) испытываем проблемы при неконтролируемом росте. В этом случае ты сможешь сделать даже свой любимый цикл в списке - просто запиши в хвостовой элемент оффсет не -1, а реальный - например, 0. Да, польза такой реализации вызовет больше вопросов, но как факт - она возможна.
                                          Кстати, классический вопрос на собеседовании - как за O(N) определить цикличен ли односвязный список.
                                          Ответить
                                • Это стало хорошим тоном с тех пор, как люди поняли разницу между O(N) и O(N^2).

                                  Если у вас вдруг такой большой массив, что «неиспользуемая память» становится критичной, будьте добры в самом начале посчитайте необходимый размер, иначе может получиться, что на массив размера Х + 1 памяти уже не хватит, хотя свободно на порядки больше — кусками по Х - 1, Х + 2, Х - 3,.. Фактически, массив на 33000 указателя может исчерпать всё адресное 32-битное пространство при такой стратегии. Такому капитану и в прапорщиках не задержаться.
                                  Ответить
                                  • > исчерпать всё адресное 32-битное пространство
                                    Для таких целей в тайных лабораториях третьего рейха разрабатывают нлосоздают 64-битные операционные системы.
                                    Ответить
                              • Как бы без разницы, чего хватает в большинстве случаев - вон в ЯваСкрипте вообще всего-то массив один и есть, и как-то живут же. Смысл в том, что название использовали не по назначению. Массив - это не разновидность списка, список - это не разновидность массива. А от того, что в Яве вдруг есть класс с названием ArrayList - так это проблемы терминологии в Яве.
                                Ответить
                                • Просто вы понимаете под списком что-то своё.
                                  ArrayList - это практически реализация АДТ "List" на основе массива.
                                  Ответить
                                  • Ну и что? Я не же против массивов. Я говорю, что попытка сделать хороший динамический массив никогда не будет успешной. Но мало того, она никогда и не нужна. Это как объять необъятное. А называть еще это потом списком - просто абсурд.

                                    Интереса ради прочитал статью в википедии про списки. Уже с самого начала в статье есть странная неопределенность, где говорится о том, что понятия "список" и "последовательность" взаимозаменимы :S Ну мне остается только развести руками. Нет, понятия не взаимозаменимы, а "интерфейс" / описание АДТ которое там приводится - это описание последовательности, (да и то не совсем, почему-то автор посчитал нужным сообщить о том, что последовательность должна обязательно содержать однотипные элементы - при том, что нет такого требования), а не списка... но очевидно людей, которые так считают очень много, а убеждать кого-то, даже одного - хз да и незачем :)
                                    Ответить
                                    • Не мне судить о "правильности" тех определений, которые стали общеупотребительными. По большому счёту не имеет значения тот набор букв, которым мы называем структуру. Имеют значения лишь свойства самой структуры.
                                      Если после CL вы не принимаете определения, отличные от определений, принятых в CL, - это ваши проблемы.
                                      Ответить
                                    • Выше я отписался. Но ещё раз отмечу: ты привык к определённой терминологии, поэтому данный List режет глаз, слух и чувство эстетического восприятия. Но я ещё раз повторю: списко - это просто последовательность элементов, не важно как организованная.
                                      Ответить
                            • можно подумать, adjustable array из CL работает как-то иначе.
                              Ответить
          • >из шарпов торчат уши портирования оных с явы
            бред
            Ответить
            • >в .NET есть отдельный LinkedList<T>
              >в .NET есть ArrayList<T>
              http://docs.oracle.com/javase/6/docs/api/java/util/LinkedList.html
              http://docs.oracle.com/javase/1.5.0/docs/api/java/util/ArrayList.html
              since 1.2

              >в .NET типы знаковые, в тех местах где знаковость не нужна
              итд.
              Продолжай жить дальше в своем уютном мелкомирке.

              2 wvxvw
              > один класс массива уже есть - зачем создавать еще один с путающим названием мне не понятно.
              Вот тут я пас.
              Ответить
              • какое значение имеет что было в Яве в какой-то версии (каком-то году). в каком году что было реализовано в Петоне и Рупи?
                или ты запал на совпадение имен?
                Ответить
                • Я рассуждаю логически, памятуя при этом разные исторические факты.
                  А вот здравого и резонного объяснения для таких моментов как
                  >в шарпе индексы массивов - знаковые.
                  >List<T>.Count заявлен как Int32 - т.е. знаковый

                  Объяснения, которое опровергнет моё утвержение о недопортировании с жабы я пока не что услышал.
                  Нет опровергающих фактов и логики тоже нет. Вместо них слышно жалкое шарпокукареканье - "бред".
                  Ответить
                  • Да, Шарп создан по образу и подобию Жабы.

                    Да, совпадения многих названия коллекций не случайны.


                    Все размеры в .NET - знаковые. Беззнаковые типы не входят в CTS - common type system, и некоторые языки под платформу .NET могут не понимать беззнаковые типы, не уметь с ними работать. Это для совместимости.

                    И неужто неизвестно, сколько проблем приносят в C/C++ беззнаковые типы? Именно в качестве size разных коллекций.
                    Ответить
                • In the coeilpcatmd world we live in, it's good to find simple solutions.
                  Ответить
                • Do you have more great <a href="http://ymtajpid.com">arilctes</a> like this one?
                  Ответить
                • Call me wind because I am abltuloesy blown away. http://plcsfnbyhn.com [url=http://fsxufmetmk.com]fsxufmetmk[/url] [link=http://dmrmedqael.com]dmrmedqael[/link]
                  Ответить
                • Wow I must confess you make some very trannhect points. http://khlzbqsx.com [url=http://euyorcbd.com]euyorcbd[/url] [link=http://qacncdhshfp.com]qacncdhshfp[/link]
                  Ответить
        • Просто беззнаковые типы не входят в CTS.
          Ответить
          • бобор прав
            это такие структуры
            http://msdn.microsoft.com/en-us/library/system.uint32.aspx
            Ответить
        • на платформе х86 работа с Int32 быстрее чем с Int16
          Ответить
          • Это смотря какой x86.
            Ответить
            • а какие бывают?
              Ответить
              • КО подсказывает, что x86 изначально был 16-битный, и на нем эмуляция 32-битной арифметики врядли была бы быстрее родной
                Ответить
              • 8086
                Ответить
                • Now I feel stdiup. That's cleared it up for me
                  Ответить
                • Just do me a favor and keep writing such trhennact analyses, OK? http://rikwajdgcqm.com [url=http://kvoglwk.com]kvoglwk[/url] [link=http://nennknsmncx.com]nennknsmncx[/link]
                  Ответить
                • Thanks for that! It's just the answer I neeedd. http://btsxujy.com [url=http://fvudkwyf.com]fvudkwyf[/url] [link=http://muyytwfu.com]muyytwfu[/link]
                  Ответить
    • показать все, что скрытоvanished
      Ответить

    Добавить комментарий