2009-10-27 10 views
12

¿Cuál es la mejor manerade lograr esto en C#?Convertir de Array para iCollection <T>

+10

No hay conversión, una gran variedad de implementos T ICollection . – Thorarin

+1

Las matrices no implementan 'ICollection ' de forma segura; consulte [answer] (http://stackoverflow.com/a/12100850/562906). – sinelaw

Respuesta

36

Las matrices de T se pueden asignar a ICollection de T, como una matriz de implementos T IList de T. IList of T se extiende a la colección de T, por lo que puede simplemente asignar una matriz a ICollection.

class Foo {} 

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

¿Está diciendo que, básicamente, no es necesario * convertir * porque Array ya * es * una ICollection? –

0

Además de la respuesta y el comentario, si quieres ir a otro manera, se utiliza el método ToArray() en IEnumerable<T> (que desciende de ICollection<T>).

20

Respuesta corta:

Uso ToList(). No confíe en que T[] se puede asignar al ICollection<T> a menos que sepa lo siguiente y sepa lo que está haciendo.

Si lo necesita solo lectura, es mejor utilizar Array.AsReadOnly(T[]) y evitar la copia adicional, y también evitar los problemas que se detallan a continuación.


respuesta detallada:

Aunque gama de T (. Es decir T[]) técnicamente implementa IList<T> (y ICollection<T> y IEnumerable<T>), se no realmente implementar los enteros IList<T> y ICollection<T> interfaces de , como se menciona in the documentation:

... Lo más importante a tener en cuenta cuando lanza una matriz a una de estas interfaces es que los miembros que agregan, insertan o eliminan elementos lanzan NotSupportedException.

En otras palabras, si usted acaba de convertir la matriz de ICollection<T> obtendrá NotSupportedException tan pronto como se llama a cualquiera de los métodos antes mencionados.

Así que la mejor manera de convertir una matriz segura a un ICollection<T> sería la creación de un nuevo objeto, como el uso de Linq 's ToList():

T[] array; 

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

Esta es la respuesta mucho mejor, aceptado realmente no menciona el "peligro" de fundición a estos sin cuidado. –

+0

Entonces, si sé que no voy a modificar la colección, ¿es seguro lanzar ICollection ? –

+0

@DanielLorenz si lo quiere como de solo lectura, es mejor hacer cumplir con ['Array.AsReadOnly (T [])'] (https://docs.microsoft.com/en-us/dotnet/api/system. array.asreadonly? view = netframework-4.7 # System_Array_AsReadOnly__1 ___ 0___) – sinelaw

Cuestiones relacionadas