- 1
- 2
- 3
- 4
- 5
- 6
private List<string> _items
...
if (_items.Count <= 0)
return;
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+121
private List<string> _items
...
if (_items.Count <= 0)
return;
abatishchev 23.01.2012 15:01 # 0
wecanstoptrain 23.01.2012 15:33 # 0
Count - это по времени в общем случае O(n)
if (!_items. GetEnumerator().MoveNext()) - это по времени всегда O(1)
wecanstoptrain 23.01.2012 15:39 # +2
Count - это по времени в общем случае O(n)
if (!_items.Any()) - это по времени всегда O(1)
хотя count может быть быстрее, если класс, реализующий List<> реализует быстрое свойство Count (например, чтение из переменной класса, а не через подсчет всех элементов), тогда компилятор сможет родить более быстрый код, чем через Any()
abatishchev 23.01.2012 15:39 # 0
SmackMyBitchUp 23.01.2012 15:49 # +1
нужное подчеркнул
guest 14.11.2015 15:14 # 0
guest 20.11.2015 07:35 # 0
guest 20.11.2015 15:08 # 0
guest 24.11.2015 09:43 # 0
guest 14.11.2015 16:02 # 0
guest 20.11.2015 07:36 # 0
guest 20.11.2015 15:09 # 0
guest 24.11.2015 09:43 # 0
roman-kashitsyn 23.01.2012 15:14 # 0
absolut 23.01.2012 16:10 # 0
3.14159265 23.01.2012 16:15 # −1
roman-kashitsyn 23.01.2012 16:16 # 0
3.14159265 23.01.2012 16:28 # −1
Хотя сейчас подумал, не факт что оно надежней (всякие переполнения, например).
absolut 23.01.2012 16:30 # 0
3.14159265 23.01.2012 16:36 # +1
wvxvw 23.01.2012 21:09 # 0
3.14159265 23.01.2012 21:26 # 0
Зачастую Listы - обертки над массивами. Там найти длину - быстро.
И ничего Майкрософт не измышлял. В шарпе индексы этих самых массивов - знаковые.
И как в вышеприведенном мною ГК из шарпов торчат уши портирования оных с явы.
В которой все примитивные типы, включая int тоже знаковые.
wvxvw 23.01.2012 21:57 # 0
Хех, почитал msdn - чет новое узнал. Да, вобщем, не список это. Так же как в Яве, одно ни к чему не обязывающее название... вообще не понятно, зачем он тогда такой нужен, если есть Array. :)
absolut 23.01.2012 22:42 # +3
wvxvw 23.01.2012 23:23 # 0
3.14159265 24.01.2012 14:26 # 0
Стандартный подход.
Кстати 6 человек плюсануло. А на мой вопрос
>в чем говно?
никто ответа не дал.
Хм. И снова цифра 6.
Alx 24.01.2012 14:33 # +1
3.14159265 24.01.2012 17:36 # 0
guest 14.11.2015 15:43 # 0
guest 20.11.2015 07:35 # 0
guest 20.11.2015 15:09 # 0
guest 24.11.2015 09:43 # 0
wvxvw 24.01.2012 14:41 # −1
roman-kashitsyn 24.01.2012 16:00 # +1
Интерфейсы позволяют получать "представление" одних коллекций в виде других. Или, например, можно реализовать список, содержащий 100 одинаковых элементов, реально храня лишь один элемент и размер списка, при этом все уже реализованные методы и функции будут для него прекрасно работать.
wvxvw 24.01.2012 23:52 # 0
Кроме Лиспа списки существуют еще много где... это как бы не эзотерика. И это не вопрос древности, есть задачи которые лучше решаются с использованием списков, есть - массивов. А валить все в одну кучу - это все равно что вережки носками называть.
roman-kashitsyn 25.01.2012 09:26 # 0
Приведу ещё пример: если вы решите реализовать ленивые списки, элементы которых вычисляются по мере необходимости, можно реализовать абстракцию списка , и вам не придётся писать кучу нового кода с алгоритмами для ленивых списков (как пришлось бы делать в Common Lisp, где нет ISeq абстракции из Clojure). Вы просто можете использовать весь код, потребляющий "Список" в качестве входных данных.
wvxvw 25.01.2012 13:48 # −1
В CL такая абстракция не нужна - список, как и массив наследуют sequence. Все методы, которые специализируются на sequence будут работать для ленивой реализации, если она будет наследоваться от sequence.
roman-kashitsyn 25.01.2012 14:32 # 0
Вот в этой книжке люди с воображением реализуют с помощью массива всё что угодно: связные списки, деревья, ассоциативные массивы, етц.
Там же можно найти описание АТД "Список", представленного в виде интерфейса в Java/C#.
wvxvw 25.01.2012 14:39 # 0
roman-kashitsyn 25.01.2012 14:55 # +2
gegMOPO4 30.01.2012 23:49 # 0
guest 14.11.2015 12:49 # 0
guest 20.11.2015 07:30 # 0
guest 20.11.2015 15:05 # 0
guest 24.11.2015 09:40 # 0
koodeer 25.01.2012 17:48 # −2
List - это список. Нет, не тот список, что в Лиспе. Просто список! Список элементов, последовательность. Массив - последовательность элементов.
Вон в STL C++, то, что в C# называется List, назвали vector. Тоже не соответствует математическому понятию вектора. И ни чо, живём с этим.
absolut 25.01.2012 17:58 # +2
в геометрическом смысле - не соответствует, а в алгебраическом - соответствует.
guest 14.11.2015 21:02 # +2
bugmenot 25.01.2012 15:03 # 0
http://www.flowerbunker.ru/gorshechnye_rasteniya/katalog/catalog_id=1855.html
3.14159265 25.01.2012 15:54 # 0
roman-kashitsyn 25.01.2012 15:58 # 0
gegMOPO4 30.01.2012 23:54 # −1
List тут не от лисповского списка, а скорее от гуишного ListBox.
abatishchev 24.01.2012 16:57 # 0
abatishchev 24.01.2012 16:58 # 0
http://msdn.microsoft.com/en-us/library/he2s3bh7.aspx
wvxvw 24.01.2012 23:57 # +1
roman-kashitsyn 25.01.2012 09:32 # +3
КО: Нужный размер может быть заранее неизвестен.
Ваши слова выдают человека, который никогда не реализовывал списки\динамические массивы\деревья\хэштаблицы ручками на православных Pascal\C\Fortran.
wvxvw 25.01.2012 13:44 # −1
roman-kashitsyn 25.01.2012 13:55 # +4
Во-вторых, выбор реализации сильно зависит потребностей конкретной задачи. Добавление в начало массива - ещё более затратная операция, поскольку приходится двигать весь хвост в конец.
С другой стороны, обращение по индексу для такого массива будет очень быстрым.
Для этого и существуют различные реализации: используйте ту из них, которая наиболее подходит в каждом конкретном случае.
Часто читаете/пишете по индексу и редко добавляете в начало? ArrayList. Часто добавляете в начало\середину? LinkedList.
В большинстве случаев вполне хватает ArrayList'а. Кроме того, если есть догадки относительно требуемого размера, их можно сообщить конструктору и он изначально выделит достаточно большой буфер.
wvxvw 25.01.2012 14:41 # −4
roman-kashitsyn 25.01.2012 14:50 # +6
defecate-plusplus 25.01.2012 15:01 # +4
поэтому в языках, дающих сунуть пальцы сразу в пламенный мотор, массив, который суть непрерывная область памяти, занятая однотипными элементами, реаллоцируется либо сам по себе при вставке в конец (и тут как раз он сам решает, сколько ему приращивать, место под один элемент, или место равное половине существующей длины - может ты следующей операций тоже вставишь), либо не реаллоцируется, т.к. у него пока хватает свободного места - потому что объем этого самого свободного места умный программист сам прикинул и посоветовал массиву
я говорю о reserve в std::vector в c++, и это нормальная практика, когда массив самостоятельно растёт в 1.5 раза, если программист лично не выделил предварительно для него места - значит программиста всё устраивает
wvxvw 25.01.2012 21:50 # −3
Есть логическое противоречие если пытаться заменить друг другом "последовательность", "список" и "массив". Последовательность не обязана быть конечной, может быть цикличной; последовательность не обязана содержать однотипные элементы. Массив - одна из разновидностей последовательности, которая не может быть бесконечной, не может быть цикличной, не может содержать разнородные элементы. Список - это другая разновидность последовательности, которая может быть бесконечной, цикличной и содержать разнородные элементы. Каким бы образом кто бы не использовал массив, нет возможности из него сделать список, т.как либо прийдется задействовать возможности списка для реализации списка (т.е. массив не может быть использован в качестве заменителя), либо все требования не будут соблюдены.
Слово "последовательность" я использую в математическом смысле, например, натуральный ряд это бесконечная последовательность натуральных чисел определенная через дискретную функцию 1+.
defecate-plusplus 25.01.2012 23:07 # +3
> Так программист может и не знать
Если программист не знает, значит для использования _массива_ ему нужны веские причины - такие, что минусы неоптимального роста будут приемлемы.
Если программист примерно предполагает конечный размер, он может руками сделать в нужном ему месте vec.reserve(vec.size() + additional) и не полагаться на x1.5 рост. Что есть для этого в дотнет - не знаю.
> Я говорю, что попытка сделать хороший динамический массив никогда не будет успешной. Но мало того, она никогда и не нужна.
В этом ты ошибаешься, иногда требуется одновременно и динамическое расширение, и O(1) для рандомного доступа, и уверенность в последовательном расположении элементов в памяти - например, прием пакета из сети, где конечная длина пакета становится известна только при получении первых N байт.
> вся остальная эзотерика о бесконечных последовательностях на конечных детерминированных железяках у тебя под столом и их именах
чего мне тут комментировать?
wvxvw 26.01.2012 01:24 # 0
По поводу "железяк" - так факт их существования не делает способ по которому они работают правильным... если исходить из наличия фактов, то нужно принять несколько сотен религий как одновременно единственно верных, например.
Кроме того, нет никакой технической сложности в реализации бесконечных (циклических) списков, это не эзотерика никакая... Понажимай на TAB - вот тебе и циклический список...
Для того же примера с пакетами - можно отдельно прочитать заголовок, и отдельно содержание - а не выделять память наугад... как бы странный пример. Да и вообще, принять как данность, что не возможно одновременно O(1) и безразмерная коллекция. А пробовать объять необъятное...
Кроме того, я не правильно изначально записал, не Х * 1.5, а Х * 2.5, т.как "старый" массив - с ним уже особо нечего делать. Т.е. это еще кроме всего остального дефрагментация...
defecate-plusplus 26.01.2012 07:43 # +1
Заявлять, что динамические массивы не нужны, потому что я использую не голову, а абстракции в дотнете, не понимая как они устроены - это неправильно.
Ну и напоследок, АДТ "Список" таки можно выполнить с помощью структуры данных "массив". Каждый элемент хранит { T data, int next_offset }, т.е. хранит номер ячейки следующего элемента, где "-1" - нет следующего элемента. Что имеем - имеем интерфейс "списка", но (плюсы) располагаем все элементы кучно (и тем самым лучше кешируем данные), можем быстро рандомно перебрать все элементы (например, для поиска минимального), и (минусы) испытываем проблемы при неконтролируемом росте. В этом случае ты сможешь сделать даже свой любимый цикл в списке - просто запиши в хвостовой элемент оффсет не -1, а реальный - например, 0. Да, польза такой реализации вызовет больше вопросов, но как факт - она возможна.
Кстати, классический вопрос на собеседовании - как за O(N) определить цикличен ли односвязный список.
gegMOPO4 31.01.2012 00:10 # +1
Если у вас вдруг такой большой массив, что «неиспользуемая память» становится критичной, будьте добры в самом начале посчитайте необходимый размер, иначе может получиться, что на массив размера Х + 1 памяти уже не хватит, хотя свободно на порядки больше — кусками по Х - 1, Х + 2, Х - 3,.. Фактически, массив на 33000 указателя может исчерпать всё адресное 32-битное пространство при такой стратегии. Такому капитану и в прапорщиках не задержаться.
eth0 31.01.2012 12:57 # 0
Для таких целей в тайных лабораториях третьего рейха разрабатывают нлосоздают 64-битные операционные системы.
gegMOPO4 31.01.2012 13:53 # 0
wvxvw 25.01.2012 14:49 # −1
roman-kashitsyn 25.01.2012 15:03 # 0
ArrayList - это практически реализация АДТ "List" на основе массива.
wvxvw 25.01.2012 15:54 # −1
Интереса ради прочитал статью в википедии про списки. Уже с самого начала в статье есть странная неопределенность, где говорится о том, что понятия "список" и "последовательность" взаимозаменимы :S Ну мне остается только развести руками. Нет, понятия не взаимозаменимы, а "интерфейс" / описание АДТ которое там приводится - это описание последовательности, (да и то не совсем, почему-то автор посчитал нужным сообщить о том, что последовательность должна обязательно содержать однотипные элементы - при том, что нет такого требования), а не списка... но очевидно людей, которые так считают очень много, а убеждать кого-то, даже одного - хз да и незачем :)
roman-kashitsyn 25.01.2012 16:01 # 0
Если после CL вы не принимаете определения, отличные от определений, принятых в CL, - это ваши проблемы.
koodeer 25.01.2012 17:51 # 0
roman-kashitsyn 25.01.2012 13:59 # 0
abatishchev 24.01.2012 16:55 # 0
бред
3.14159265 24.01.2012 17:35 # 0
>в .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
> один класс массива уже есть - зачем создавать еще один с путающим названием мне не понятно.
Вот тут я пас.
abatishchev 24.01.2012 18:13 # 0
или ты запал на совпадение имен?
3.14159265 24.01.2012 18:52 # 0
А вот здравого и резонного объяснения для таких моментов как
>в шарпе индексы массивов - знаковые.
>List<T>.Count заявлен как Int32 - т.е. знаковый
Объяснения, которое опровергнет моё утвержение о недопортировании с жабы я пока не что услышал.
Нет опровергающих фактов и логики тоже нет. Вместо них слышно жалкое шарпокукареканье - "бред".
koodeer 25.01.2012 17:55 # +1
Да, совпадения многих названия коллекций не случайны.
Все размеры в .NET - знаковые. Беззнаковые типы не входят в CTS - common type system, и некоторые языки под платформу .NET могут не понимать беззнаковые типы, не уметь с ними работать. Это для совместимости.
И неужто неизвестно, сколько проблем приносят в C/C++ беззнаковые типы? Именно в качестве size разных коллекций.
guest 14.11.2015 16:02 # 0
guest 20.11.2015 07:36 # 0
guest 20.11.2015 15:09 # 0
guest 24.11.2015 09:43 # 0
bober_maniac 23.01.2012 23:19 # +2
guest 24.01.2012 04:16 # 0
это такие структуры
http://msdn.microsoft.com/en-us/library/system.uint32.aspx
abatishchev 24.01.2012 16:59 # 0
gegMOPO4 31.01.2012 00:14 # +1
abatishchev 31.01.2012 12:26 # −1
defecate-plusplus 31.01.2012 12:43 # 0
gegMOPO4 31.01.2012 13:53 # +2
guest 14.11.2015 12:57 # 0
guest 20.11.2015 15:05 # 0
guest 24.11.2015 09:40 # 0
guest8 09.04.2019 12:34 # −999