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