2011-11-08 11 views
13

mam ten kod:Problemy z IList. Naprawiono rozmiar?

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

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

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

ale wydaje się, że IList mieć stały rozmiar po .split(): System.NotSupportedException: Kolekcja została stałej wielkości.

Jak mogę rozwiązać ten problem?

+1

'string.Split()' zwraca tablicę ciągów znaków. Tablice mają stały rozmiar, stąd wyjątek, który otrzymujesz. – BoltClock

+0

Jest to spowodowane złymi decyzjami dotyczącymi projektowania w .NET: http://stackoverflow.com/questions/5968708/why-array-implements-ilist/5968798#5968798 – mbeckish

Odpowiedz

15

Sposób Split zwraca tablicę i nie można zmienić rozmiaru tablicy.

Można utworzyć List<string> z tablicy przy użyciu metody ToList rozszerzenia:

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

lub konstruktora List<T>:

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

Poza tym, prawdopodobnie nie chcą korzystać z interfejsu IList<T> jako typ zmiennej, ale po prostu użyj rzeczywistego typu obiektu:

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

czyli

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

To pozwoli Ci wykorzystać właśnie klasa może zrobić, nie ograniczając się do interfejsu IList<T> i żadne metody, które nie są obsługiwane.

+0

Może to być problem, jeśli stelleString jest "". Powinienem go wypróbować ... – markzzz

+1

@markzzz: Jeśli ciąg znaków nie zawiera separatora, metoda 'Split' zwraca tablicę z pojedynczym elementem, zawierającym oryginalny ciąg znaków. Jeśli chcesz zająć się tym inaczej, spróbuj ...catch' nie pomoże, musisz sprawdzić 'Count' z listy. – Guffa

13

string.Split zwraca ciąg znaków tablica. To rzeczywiście miałoby stały rozmiar.

można przekonwertować go na List<string> przekazując wynik do konstruktora List<T>:

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

Albo, jeśli są dostępne, można użyć operatora LINQ ToList():

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

Brzmi jak System.Array implementuje IList syntaktycznie, ale nie semantycznie. Niefortunny. –

2

połączeń ToList() do wyniku:

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

Ma stały rozmiar przyczynę string.Split zwraca ciąg []. Należy przekazać wartość zwracaną przez split do instancji klasy < w celu obsługi dodawania dodatkowych elementów.

0

String.split zwraca tablicę. Ale możesz zredukować tablicę. W języku VB jest to

ReDim perserve myarray(newlength minus one)