在C#中实现此目的的 最佳 方式是什么?
答案 0 :(得分:38)
T的数组可分配给T的ICollection,因为T的数组实现了T的IList.IL的T本身扩展了T的ICollection,因此您可以简单地将数组分配给ICollection。
class Foo {}
Foo [] foos = new Foo [12];
ICollection<Foo> foo_collection = foos;
答案 1 :(得分:20)
简短回答:
使用ToList()。除非您了解以下内容并知道自己在做什么,否则不要依赖T[]
可分配给ICollection<T>
。
如果您需要它是只读的,最好使用Array.AsReadOnly(T[])
并避免额外的副本,并避免下面详述的问题。
详细解答:
虽然T(即。T[]
)的数组实现IList<T>
(以及ICollection<T>
和IEnumerable<T>
),但确实实际上没有实现整个IList<T>
和ICollection<T>
接口,如上所述in the documentation:
...将数组转换为其中一个接口时要注意的关键是添加,插入或删除元素的成员抛出
NotSupportedException
。
换句话说,如果您只是将数组转换为ICollection<T>
,只要您调用上述任何方法,就会得到NotSupportedException
。
因此,将数组安全转换为ICollection<T>
的最佳方法是创建一个新对象,例如使用Linq
的{{1}}:
ToList()
答案 2 :(得分:0)
除了答案和评论之外,如果您想使用其他方式,请使用ToArray()
上的IEnumerable<T>
方法(ICollection<T>
来自)。