Является ли приведение IEnumerable к ArrayList O (N) или O (1)? - PullRequest
4 голосов
/ 08 июня 2011

Когда я делаю этот актерский состав:

private IEnumerable objects;
ArrayList castedObjects = (ArrayList)objects;

Является ли это "прямым" приведением или перечислимое преобразовано в ArrayList с помощью внутреннего метода (который, по-видимому, проходит через все элементы)?

Ответы [ 3 ]

5 голосов
/ 08 июня 2011

Это либо "прямое" приведение (если базовый объект на самом деле является экземпляром ArrayList), либо вы получите исключение .Неявное создание объекта ArrayList не выполняется "за сценой".

3 голосов
/ 08 июня 2011

Это прямой актерский состав. Это будет работать, только если объект уже имеет значение ArrayList, например:

IEnumerable objects = new ArrayList();
ArrayList castedObjects = (ArrayList)objects;

Если объект не ArrayList, а какой-то другой объект, который реализует IEnumerable, приведение завершится неудачей.

Вы можете создать ArrayList из ICollection, например:

ICollection objects = new string[] { "a", "b" };
ArrayList castedObjects = new ArrayList(objects);

Это перебирает коллекцию и копирует элементы в ArrayList, так что это операция O (n).


Как правило, вам вообще не следует использовать класс ArrayList, а общий класс List<T>, который предлагает строгую типизацию.

1 голос
/ 08 июня 2011

Это зависит от того, что на самом деле является objects. На него ссылаются как IEnumerable, но его фактический тип может быть любым, что реализует IEnumerable.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...