Что такое лучший способ выполнить это на С#?
Преобразовать из массива в ICollection <T>
Ответ 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>
спускается).