从Array转换为ICollection <t> </t>

时间:2009-10-27 12:49:17

标签: c#

在C#中实现此目的的 最佳 方式是什么?

3 个答案:

答案 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>来自)。