2009-10-27 36 views
12

什麼是最好在C#中完成此操作的方法?從數組轉換爲ICollection <T>

+10

沒有轉換,T工具的數組ICollection 。 – Thorarin 2009-10-27 12:54:47

+1

陣列不安全地執行'ICollection ' - 參見[答案](http://stackoverflow.com/a/12100850/562906)。 – sinelaw 2013-01-23 16:15:04

回答

36

T的數組可以分配給T的ICollection,如T的一個實現T的IList。T的Tist自身擴展T的ICollection,因此您可以簡單地將一個數組分配給一個ICollection。

class Foo {} 

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

你是說,基本上,沒有必要*轉換*,因爲數組已經*是一個ICollection? – 2015-07-30 14:26:25

0

除了回答和評論,如果你想要去的其他方式,您使用的IEnumerable<T>方法ToArray()(其中ICollection<T>從下降)。

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>將創建新的對象,如使用的最佳方法LinqToList()

T[] array; 

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

這是一個更好的答案,接受並沒有真正提到鑄造到這些毫不在意的「危險」。 – 2016-02-03 10:03:01

+0

因此,如果我知道我不打算修改集合,那麼投射ICollection 是安全的? – 2018-01-05 02:08:37

+0

@DanielLorenz如果您希望它只讀,最好使用['Array.AsReadOnly(T [])'](https://docs.microsoft.com/zh-cn/dotnet/api/system)來強制執行。 array.asreadonly?視圖= netframework-4。7#System_Array_AsReadOnly__1 ___ 0___) – sinelaw 2018-01-09 08:51:11