Подтвердить что ты не робот

Преобразовать из массива в ICollection <T>

Что такое лучший способ выполнить это на С#?

4b9b3361

Ответ 1

Массивы T назначаются ICollection T, поскольку массив T реализует IList из T. IList самого T расширяет ICollection of T, поэтому вы можете просто назначить массив ICollection.

class Foo {}

Foo [] foos = new Foo [12];
ICollection<Foo> foo_collection = foos;

Ответ 2

Короткий ответ:

Используйте ToList(). Не полагайтесь на T[] на назначение ICollection<T>, если вы не знаете следующее и не знаете, что делаете.

Если вам это нужно только для чтения, лучше использовать Array.AsReadOnly(T[]) и избегать дополнительной копии, а также избегать подробностей ниже.


Подробный ответ:

Хотя массив T (т.е. T[]) технически реализует IList<T>ICollection<T> и IEnumerable<T>), он фактически не реализует все IList<T> и ICollection<T>, как упоминалось в документации:

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

Другими словами, если вы просто набросаете массив на ICollection<T>, вы получите NotSupportedException, как только вы вызовете любой из вышеупомянутых методов.

Таким образом, наилучшим способом преобразования массива безопасно в ICollection<T> будет создание нового объекта, например, с помощью Linq ToList():

T[] array;

// Will create a new list based on the current contents of the array
ICollection<T> collection = array.ToList();

Ответ 3

В дополнение к ответу и комментарию, если вы хотите пойти другим путем, вы используете метод ToArray() на IEnumerable<T> (из которого ICollection<T> спускается).