2011-12-21 1 views
2

Пока я занимаюсь программой, иногда у меня возникают такие сомнения. Я использую List<T>, но я не использовал других.Кто-то может сказать мне, в чем разница между списком, сборкой и перечислимым?

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

+6

См. Документацию. – SLaks

+0

Зависит от того, что вы хотите сделать также со списком Дженерики - это отличный способ создать или убедиться, что что-то есть в списке типов типов, а также в коллекции, но если вы хотите перечислить что-то там, где вам нужно будет очень много создавать свои собственные enumerator (Counter) IEnumerable было бы хорошо .. но тогда есть также foreach, и для циклов это зависит только от того, что вы хотите делать, и от того, как быстро вы хотите, чтобы Nicholas опубликовал отличные ссылки, чтобы объяснить это лучше всего. – MethodMan

ответ

6

Я уверен, что вы можете прочитать документацию самостоятельно. Я кратко сообщу здесь:

  1. IEnumerable - это интерфейс, который предоставляет перечислитель по коллекции. Внедрите этот интерфейс, если хотите иметь возможность поддерживать итерацию, например, внутри цикла foreach.
  2. Collection является реализация IEnumerable (поэтому вы можете перемещаться по нему), который, как правило, дополнительно расширен пользователем классов, которые хотят иметь коллекцию поведение как (т.е. использовать Add, Remove, Contains и т.д.). Его также можно использовать как «как есть».
  3. List также является реализацией IEnumerable (поэтому вы можете перебирать его), который обычно используется как «как есть» в качестве контейнера для объектов определенного типа. Использует динамически настраиваемый массив в фоновом режиме и является общим эквивалентом ArrayList.

Обратите внимание, что в то время как IEnumerable может быть как общей, так и не родовое, Collection и List могут быть использованы только в качестве общих классов.

1

Список является инстанциируемый тип, который содержит элементы в линейной форме. (Edit: Мне говорят, что он реализован с динамическим массивом, а не с Linked List, который был только моим догадкой).

ICollection/CollectionBase и IEnumerable не являются непосредственно конкретными типами.

CollectionBase/ICollection - это базовый класс/интерфейс, который наследуется/реализуется любым классом, который считает себя коллекцией и содержит несколько элементов. CollectionBase/ICollection также позволяет вам собирать коллекции, не зная их реализации.

IEnumerable также является интерфейсом, который предоставляет методы для итерации по коллекции. IEnumerable в основном позволяет использовать foreach петли в коллекции. Вы можете использовать методы интерфейса напрямую, чтобы получить итераторы стиля C++, но цикл foreach менее подвержен ошибкам.

+2

Список использует динамический массив, а не связанный список. – Tudor

+1

@Digitlworld: В странном мире команды CLR от Microsoft списки не являются фактически списками в смысле CS: хранилище поддержки для '' SCG.List '' и 'SC.List' представляет собой массив, который динамически растет путем выделения и копирования , ICollection и IEnumerable не являются типами: они являются интерфейсами. –

+0

На земле C# я понимал, что интерфейсы, абстрактные классы и обычные классы - это все 'Type's. Репликационные примеры их определения - все допустимые значения для 'Type'. – digitlworld

0

Если посмотреть на определения трех (см ниже) вы увидите, что List реализует Enumerable и ICollection и ICollection орудия IEnumerable.Более наглядно:

List является КЛАСС который может хранить переменное количество элементов одного и того же типа, а также функциональные возможности, указанных двух других интерфейсов.

ICollection - это интерфейс, который определяет общий способ управления коллекциями. ПРИМЕЧАНИЕ: это интерфейс и, следовательно, НЕ может быть создан.

IEnumerable - это интерфейс, который указывает средство итерации по коллекции. ПРИМЕЧАНИЕ: это интерфейс и, следовательно, НЕ может быть создан.

List

Представляет строго типизированный список объектов, которые могут быть доступны по индексу. Предоставляет методы поиска, сортировки и управления списками.

public class List<T> : IList<T>, ICollection<T>, 
IEnumerable<T>, IList, ICollection, IEnumerable 

ICollection

Определяет методы для манипулирования обобщенных коллекций.

public interface ICollection<T> : IEnumerable<T>, 
IEnumerable 

IEnumerable

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

public interface IEnumerable<out T> : IEnumerable