2009-02-21 2 views
7

У меня есть класс Customer (с типичными свойствами клиента), и мне нужно пройти, а databind - «кусок» из Customer экземпляров. В настоящее время я использую массив Customer, но я также использовал Collection из T (ииз T, прежде чем я узнал о Collection из T). Я бы хотел, чтобы самый тонкий способ передать этот фрагмент с использованием C# и .NET 3.5.ArrayList по сравнению с массивом объектов по сравнению с коллекцией T

В настоящее время массив Customer работает отлично для меня. Эти данные хорошо связываются и кажутся такими же легкими, как и все. Мне не нужны вещи List из T предложений и Collection из T все еще кажется излишним. Массив требует, чтобы я знал заранее, сколько Customer s Я добавляю к куску, но я всегда знаю это заранее (например, строки на странице).

Я пропустил что-то фундаментальное или это массив Customer OK? Есть ли компромисс, который мне не хватает?

Кроме того, я предполагаю, что Collection из T делает старый неспециализированный ArrayList устаревшим. Я здесь?

ответ

4

Никто не упомянул совет Рамочные Guidelines: Don't use List<T> in public API's:

Мы не рекомендуем использовать список в общественных API, по двум причинам.

  • List<T> не предназначен для продления. то есть вы не можете переопределить всех членов . Это, например, означает, что объект, возвращающийся List<T>, из свойства не сможет получить уведомление , когда коллекция будет изменена. Collection<T> позволяет вам переопределять Защищенный элемент SetItem для получения «уведомлен» при добавлении новых товаров или существующий элемент изменен.

  • В списке много членов, которые не имеют отношения ко многим сценариям. We говорят, что List<T> слишком «занят» для моделей общественных объектов. Представьте Свойство ListView.Items возвращает List<T> со всем его богатством. Теперь, посмотреть фактические ListView.Items тип возврата; это способ проще и похож на Collection<T> или ReadOnlyCollection<T>

Кроме того, если ваша цель состоит в том двухсторонняя Databinding, взглянуть на BindingList<T> (с оговоркой, что это не сортируется «из коробки '!)

11

Да, Collection<T> (или List<T> чаще) делает ArrayList в значительной степени устаревшим. В частности, я считаю, что ArrayList даже не поддерживается в Silverlight 2.

Массивы в порядке, в любом случае, но должны быть considered somewhat harmful - они имеют различные недостатки. (Они в основе реализации большинства коллекций, конечно ...) Я хотел бы получить более подробную информацию, но Эрик Липперт делает это намного лучше, чем когда-либо в статье, на которую ссылается ссылка. Я бы обобщил его здесь, но это довольно сложно сделать. На самом деле стоит просто прочитать весь пост.

+0

Он делает отличную работу в этой статье, хорошо читает для тех, кто еще этого не сделал. –

3

Как правило, вы должны «обойти» IEnumerable <T> или ICollection <T> (в зависимости от того, имеет ли смысл для вашего потребителя добавлять элементы).

0

Я собираюсь привести несогласный аргумент как Джону, так и Эрику Липперту), а это значит, что вы действительно очень устали от моего ответа!).

Сердце аргументов Эрика Липперта против массивов состоит в том, что содержимое является неизменным, а сама структура данных - нет. Что касается возврата их из методов, содержимое списка также изменчиво. На самом деле, поскольку вы можете добавлять или вычитать элементы из списка, я бы сказал, что это делает возвращаемое значение более изменчивым, чем массив.

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

В любом случае, послушайте Джона и Эрика =), и я согласен, что List почти всегда имеет больше смысла.

+0

Есть, конечно, места, где имеет смысл использовать массивы, и они действительно будут работать лучше. Это повод использовать их *, где критическая производительность * (это не так много мест IME).Для аргумента неизменяемости: если вы объявляете, что метод возвращает Foo [], то он всегда будет изменяться. –

+0

Если, с другой стороны, вы заявляете, что он возвращает IList , тогда возвращаемое значение * может * быть изменчивым или оно * может * быть неизменным - и вы можете легко создать оболочку только для чтения. Это не столько аргумент «array vs List » как «массив против интерфейса» для возвращаемых типов. –

+0

Не могли бы вы вернуть массив IImmutableObject [], хотя? Я не пытаюсь спорить, но этот аргумент для меня никогда не имел смысла. (В случае, если кто-либо найдет мой аргумент убедительным, используйте Список , так как это правильно делать в 99,9% случаев). – Travis

0

Я согласен с Alun, с одним дополнением. Если вы можете обратиться к возвращаемому значению по индексу myArray [n], используйте IList.

Array по существу поддерживает IList (а также IEnumerable и ICollection, если на то пошло). Поэтому, если вы проходите по интерфейсу, вы все равно можете использовать массив как свою базовую структуру данных. Таким образом, методы, которые вы передаете массив в не должны «знать», что основная структура данных является массивом:

 public void Test() 
{ 
    IList<Item> test = MyMethod(); 
} 

public IList<Item> MyMethod() 
{ 
    Item[] items = new Item[] {new Item()}; 
    return items; 
} 
1

Если у вас есть неизменный список клиентов, то есть ... ваш список клиентов не изменится, он будет относительно небольшим, и вы всегда будете перебирать его в первую очередь, и вам не нужно добавлять его в список или удалять из него, тогда массив, вероятно, просто отлично.

Если вы не уверены, то ваш лучший выбор - это коллекция какого-то типа. Выбор выбранной вами коллекции зависит от операций, которые вы хотите выполнить. Коллекции - все о вставках, манипуляциях, поиске и удалении. Если вы часто проводите частые поиски для данного элемента, то словарь может быть лучшим. Если вам нужно отсортировать данные, возможно, SortedList будет работать лучше.

Я бы не стал беспокоиться о «легком», если вы не говорите о большом количестве элементов, и даже тогда преимущества поиска O (1) перевешивают затраты ресурсов.

Когда вы «обходите» коллекцию, вы передаете только ссылку, которая в основном является указателем. Таким образом, нет никакой разницы в производительности между передачей коллекции и массивом.

Смежные вопросы