2011-11-08 20 views
13

tengo este código:Problema IList. ¿Tamaño fijo?

IList<string> stelle = stelleString.Split('-'); 

if (stelle.Contains("3")) 
    stelle.Add("8"); 

if (stelle.Contains("4")) 
    stelle.Add("6"); 

pero parece que IList tiene un tamaño determinado a partir de .split(): System.NotSupportedException: Colección era de un tamaño fijo.

¿Cómo puedo solucionar este problema?

+1

'string.Split()' devuelve una matriz de cadenas. Las matrices son de tamaño fijo, de ahí la excepción que estás recibiendo. – BoltClock

+0

Esto se debe a malas decisiones de diseño en .NET: http://stackoverflow.com/questions/5968708/why-array-implements-ilist/5968798#5968798 – mbeckish

Respuesta

15

El método Split devuelve una matriz y no puede cambiar el tamaño de una matriz.

Se puede crear un List<string> de la matriz mediante el método ToList extensión:

IList<string> stelle = stelleString.Split('-').ToList(); 

o la List<T> constructor:

IList<string> stelle = new List<string>(stelleString.Split('-')); 

Además, es probable que no quieren utilizar la interfaz IList<T> como el tipo de la variable, pero solo use el tipo real del objeto:

string[] stelle = stelleString.Split('-'); 

o:

List<string> stelle = stelleString.Split('-').ToList(); 

Esto le permitirá utilizar exactamente lo que la clase puede hacer, no se limita a la interfaz IList<T>, y no hay métodos que no son compatibles.

+0

Esto podría ser un problema si stelleString es "". Debería ponerlo en una captura de prueba ... – markzzz

+1

@markzzz: si la cadena no contiene el delimitador, el método 'Split' devuelve una matriz con un solo elemento, que contiene la cadena original. Si quieres manejar eso de manera diferente, a 'intenta ...catch' no ayudará, tienes que verificar 'Count' de la lista. – Guffa

13

string.Split devuelve una cadena matriz. Esto de hecho tendría un tamaño fijo.

Puede convertirlo en un List<string> pasando el resultado a la List<T> constructor:

IList<string> stelle = new List<string>(stelleString.Split('-')); 

O, si está disponible, puede utilizar el operador LINQ ToList():

IList<string> stelle = stelleString.Split('-').ToList(); 
+1

Suena como System.Array implementa IList sintácticamente pero no semánticamente. Desgraciado. –

2

llamada ToList() al resultado:

IList<string> stelle = stelleString.Split('-').ToList(); 
3

Tiene un tamaño fijo causa string.Split devuelve una cadena []. Debe pasar el valor devuelto de la división a una instancia de la cadena < > para admitir la adición de elementos adicionales.

0

String.split devuelve una matriz. Pero puedes redimensionar la matriz. En VB es

ReDim perserve myarray(newlength minus one) 
Cuestiones relacionadas