Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> T[] vs List<T>, что лучше 
:(
    Опции темы
archeg
Дата 1.6.2007, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 6.1.2007
Где: Киев

Репутация: 11
Всего: 27



Почему в шарпе нету связаного списка? (если List<T> - на самом деле обертка над T[]) или я что-то пропустил?  smile 
Код

class List
{
   public List NextNode;
   public object value;
}



--------------------
ИМХО задница есть универсальный интерфейс. Ибо через задницу можно сделать абсолютно ВСЕ (bash.org.ru)

Дядька всегда можно спросить в аське, если не задалбывать - не откажет smile
И вообще, на самом деле я студент, и ненавижу обращение на "Вы") Тут все свои  ;)
PM MAIL ICQ Jabber   Вверх
Naum
Дата 1.6.2007, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 743
Регистрация: 7.9.2005
Где: Саратов, ул. Поса дского, 298

Репутация: 8
Всего: 15



archegsmile по-моему, вообще не в тему. В принципе, есть такое. Но есть же TreeNode, ведь по сути связанный список - это унарное дерево.


--------------------
У нас всего два праздника Новый год и ТЯПница.
PM MAIL ICQ   Вверх
adLucem
Дата 1.6.2007, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 17.4.2007
Где: Украина, Донецк

Репутация: 4
Всего: 5



Цитата(tol05 @  1.6.2007,  07:43 Найти цитируемый пост)
Лично мое мнение: Генерики - удобнее. Массивы и типизированные коллекции - продуктивнее.


На каком основании такие заявления?

tol05ПРИВЕДИТЕ ПРИМЕР (Исходные данные, полученные метрики) - а свое мнение и пространные, большей частью бесполезные рассуждения можете оставить при себе.

У Вас пальцы не устают столько флудить?

PM MAIL ICQ   Вверх
ivashkanet
Дата 1.6.2007, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Товарищи, вот уж не думал, что эта тема разовьется в такой спор  smile 

Мое мнение: если вы точно знаете размер вашей коллекции и он не изменяется, то однозначно лучше использовать массив (хотя очень часто я использую Лист и в этом случае, ибо он удобнее).
Но если, вы не в курсе, сколько элементов будет у вас в массиве, то лучше использовать специализированную коллекцию.
Одной из таких коллекций является List<string>.
Причем дженерики ни коем образом не относятся к коллекциям, это просто удобный инструмент для создания шаблонных классов, работающих с любым конкретным типом, вместо того, чтобы плодить туеву хучу реализаций одной и той же логики для разных типов.

Перейдем к реализации List<T>:
Да, за дополнительные возможности нужно платить, тут уж не попишешь :( (Что тут у нас, а --- возможность добавления новых элементов без ресайза коллекции).

Чем же мы расплачиваемся: 
В первую очередь памятью. Возможность "безболезненного" увеличения размера коллекции реализована за счет избыточности. Она храним "пустые" ячейки для новых элементов коллекции. Например, коллекция, состоящая из 10 элементов будет хранить 6 (=16-10) пустых ячеек.
Во вторую очередь скоростью доступа. List<T> реализуется как обертка над массивом T[]. Так что при доступе к элементу коллекции мы, в любом случае, обращаемся к массиву:
Код

public T this[int index]
{
    get
    {
        if (index >= this._size)
        {
            ThrowHelper.ThrowArgumentOutOfRangeException();
        }
        return this._items[index];
    }
    set
    {
        if (index >= this._size)
        {
            ThrowHelper.ThrowArgumentOutOfRangeException();
        }
        this._items[index] = value;
        this._version++;
    }
}

Что у нас тут? Обращение к массиву (никуда от этого не деться) + трата времени на проверку индекса и сам вызов метода get. Не очень хорошо :(

Вот две основные проблемы использования коллекции вместо простого массива. Есть и более мелкие проблемы, но эти две, ИМХО, самые важные (среди них никому не нужное поле version, которое хранить версию массива, получить которую не представляется возможным, да и нафик она кому нужна, ИМХО).

Но, все же, несмотря на перечисленные проблемы коллекции MUST HAVE. Только одно динамическое увеличение размера по мере добавления элементов достойно бурных оваций и закрытию глаз на перечисленные выше "проблемы".

Кроме того, я не зря взял слово "проблемы" в кавычки. Эти "проблемы" действительно не стоят того, чтобы на них обращать внимания в 99,99% случаев. Действительно:
Память. Ну кого, скажите, волнует наличие неиспользованных 6*4 = 24 байт на хранение "резерва" в примере выше, когда совершенно пустое WinForm приложение занимает 4Мб памяти? 
Но все же если вы используете "сотни тысяч" таких коллекций, то стоит пересмотреть свою позицию (это та самая сотая процента)
Производительность. Один запрос к диску, БД, да еще по сети, отображение UI, ожидание ответа пользователя, ...  сводят на нет все проблемы связанные с доступом к элементу коллекции. Так что, если вы не пишите критическую часть приложения, которая будет юзаться "сотни тысяч раз" на протяжении 1 минуты, то можно забить и на эту проблему.

Цитата(tol05 @  31.5.2007,  13:56 Найти цитируемый пост)
как он может работать быстрее чем T[] ? У него внутри их два и еще много чего, да и свойства, проверки...

Один из которых статический, т.е. не имеет никакого отношения к конкретному экземпляру. 
Кроме того, на единичных операциях массивы бесспорно выигрывают, но при интенсивном добавлении новых элементов массивы нервно курят в сторонке.

Пример: ты получаешь некие сообщения из нескольких источников (от геодезических зондов, например) и тебе нужно каждую минуту отправлять собранные сообщения дальше. Что лучше использовать?

Цитата(SpaceSpace @  1.6.2007,  07:26 Найти цитируемый пост)
Но все-же T[] - суть есть Ссылочный тип!!!, лежит он в куче, как и <T>

Позволю себе не согласится. int[], как и любой struct[], является структурным типом, если он: локальная переменная, либо часть другой структуры.
Цитата(archeg @  1.6.2007,  11:17 Найти цитируемый пост)
Почему в шарпе нету связаного списка?

LinkedList<T> (хоть это и двусвязный список)
PM MAIL WWW ICQ   Вверх
adLucem
Дата 1.6.2007, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 17.4.2007
Где: Украина, Донецк

Репутация: 4
Всего: 5



Цитата(ivashkanet @  1.6.2007,  12:17 Найти цитируемый пост)
Позволю себе не согласится. int[], как и любой struct[], является структурным типом, если он: локальная переменная, либо часть другой структуры.


MSDN:

Arrays (C# Programming Guide)

Цитата

Array types are reference types derived from the abstract base type Array. Since this type implements IEnumerable and IEnumerable, you can use foreach iteration on all arrays in C#.

PM MAIL ICQ   Вверх
ivashkanet
Дата 1.6.2007, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



adLucem, точно, только что протестил. И почему я думал по другому  smile  smile 
PM MAIL WWW ICQ   Вверх
Exception
Дата 2.6.2007, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 29
Всего: 186



Блин, tol05, ты меня не понял smile .
Во-первых, насчёт Mono, я имел в виду, что, если хочешь знать, как реализуется какой-то класс, то можно посмотреть в него, и призывать тебя что-то говорить начальнику или хотя бы самому юзать Mono я даже не собирался smile . Кстати, Mono -- не .NET под Линукс, он кроссплатформенный и может работать и под Windows.
Насчёт дженериков, если ты решил что эта идея нова и "подсунута Билли", то ты сильно ошибаешься, так как она ещё более полно реализована в С++ (шаблоны) и многих других языках. Да и в Java они есть (хотя там это синтаксический сахар). Если ты не научился использовать какое-то средство языка разумно, не стоит делать преждевременных выводов о нём. Дженерики часто бывают полезны, например, при разработке и использовании многоцелевых каркасов приложений (типа CAB). Однако, само собой, их не надо лепить где попало, так как абстрагирование местами только усложняет проектное решение.
Массив следует использовать, когда нужен массив, а список -- когда нужен список smile . А спор такой разгорелся именно потому что автор задал вопрос в отрыве от контекста: что лучше, сыр или колбаса? Всё зависит от того, что ты хочешь скушать smile .
PM   Вверх
tol05
Дата 2.6.2007, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



 smile 
 smile 
Да ладно... Действительно, правильно ivashkanet, выразился - если три-четыре горячих парня встретятся, то жди беды  smile и не важно, на какую тему говорить! 
Генерики - не шаблоны.
http://blogs.gotdotnet.ru/personal/mihaili...50-B21953401B95
 Java - не смотрел, думал в отпуске заняться
все, типа сдаюсь. smile 



--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0896 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.