2011-11-08 44 views
13

tôi có mã này:Sự cố nghiêm trọng. Kích thước cố định?

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

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

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

nhưng dường như IList có kích thước cố định sau một .Split(): System.NotSupportedException: Bộ sưu tập là một kích thước cố định.

Làm cách nào để khắc phục sự cố này?

+1

'string.Split()' trả về một mảng chuỗi. Mảng có kích thước cố định, do đó ngoại lệ bạn nhận được. – BoltClock

+0

Điều này là do các quyết định thiết kế kém trong .NET: http://stackoverflow.com/questions/5968708/why-array-implements-ilist/5968798#5968798 – mbeckish

Trả lời

15

Phương pháp Split trả về một mảng, và bạn không thể thay đổi kích thước một mảng.

Bạn có thể tạo một List<string> từ mảng bằng cách sử dụng phương pháp ToList mở rộng:

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

hoặc List<T> constructor:

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

Bên cạnh đó, có thể bạn không muốn sử dụng giao diện IList<T> là loại biến, nhưng chỉ sử dụng loại thực tế của đối tượng:

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

hay:

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

này sẽ cho phép bạn sử dụng chính xác những gì các lớp có thể làm, không giới hạn ở những giao diện IList<T>, và không có phương pháp mà không được hỗ trợ.

+0

Điều này có thể là một vấn đề nếu stelleString là "". Tôi nên đặt nó trên một thử bắt .... – markzzz

+1

@markzzz: Nếu chuỗi không chứa dấu phân tách, phương thức 'Tách' trả về một mảng với một mục duy nhất, chứa chuỗi gốc. Nếu bạn muốn xử lý một cách khác, hãy thử ...catch' sẽ không giúp bạn, bạn phải kiểm tra 'Count' của danh sách. – Guffa

13

string.Split trả về một chuỗi mảng. Điều này thực sự sẽ có một kích thước cố định.

Bạn có thể chuyển nó sang một List<string> bằng cách thông qua kết quả cho List<T> constructor:

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

Hoặc, nếu có sẵn, bạn có thể sử dụng toán tử LINQ ToList():

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

Âm thanh như System.Array thực hiện IList cú pháp nhưng không phải ngữ nghĩa. Không may. –

2

Gọi ToList() đến kết quả:

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

Nó có một nguyên nhân kích thước cố định string.Split trả về một string []. Bạn cần chuyển giá trị trả về của phân tách thành một ví dụ < chuỗi > để hỗ trợ thêm các thành phần bổ sung.

0

String.split trả về một mảng. Nhưng bạn có thể redimensionate mảng. Trong VB, nó là

ReDim perserve myarray(newlength minus one) 
Các vấn đề liên quan