2010-05-19 71 views
8

Tại sao mã bên dưới không xóa tất cả dữ liệu danh sách mảng?Xóa tất cả dữ liệu danh sách mảng

 Console.WriteLine("Before cleaning:" + Convert.ToString(ID.Count)); 
     //ID.Count = 20 
     for (int i = 0; i < ID.Count; i++) 
     { 
      ID.RemoveAt(i); 
     } 
     Console.WriteLine("After cleaning:" + Convert.ToString(ID.Count)); 
     //ID.Count = 10 

Tại sao 10 bản in ra màn hình?

Có thể có một chức năng đặc biệt khác xóa mọi thứ?

+0

Lần đầu tiên thông qua vòng lặp, bạn xóa mục ở vị trí 0.Hiện tại có 19 mục trong danh sách, mục tại vị trí 1 giờ di chuyển đến vị trí 0, 2 -> 1, 3-> 2 vv Lần thứ hai thông qua vòng lặp bạn xóa mục ở vị trí 1 (mục này từng là mục 2). Bạn đã bỏ qua mục ở vị trí 0 (đã từng là mục 1). Bằng cách này, bạn sẽ xóa mọi mục thứ hai khỏi danh sách. –

Trả lời

6
`Array.Clear()` 

xóa tất cả các mục trong mảng.

`Array.RemoveAt(i)` 

xóa phần tử của chỉ mục thứ i trong mảng.

2

Sử dụng rõ ràng() Phương pháp

hoặc

thay đổi ID.RemoveAt(i);-ID.RemoveAt(0);

Bất cứ khi nào một yếu tố được lấy từ bộ sưu tập, chỉ số của nó cũng thay đổi. Do đó, khi bạn nói ID.RemoveAt(0); phần tử ở chỉ mục 1 bây giờ sẽ được chuyển đến chỉ mục 0. Vì vậy, một lần nữa bạn đã loại bỏ cùng một phần tử (như dequeuing). cho đến khi bạn đến được phần tử cuối cùng. Tuy nhiên, nếu bạn muốn loại bỏ tất cả các phần tử cùng một lúc, bạn có thể sử dụng phương thức Clear() tốt hơn.

2

Sau khi xóa 10 mục, ID.Count() == 10i == 10 để vòng lặp dừng.

Sử dụng ID.Clear() để xóa tất cả các mục trong danh sách mảng.

11

Bạn chỉ thực sự gọi RemoveAt 10 lần. Khi i đạt 10, ID.Count cũng sẽ là 10. Bạn thể khắc phục điều này bằng cách thực hiện:

int count = ID.Count; 
for (int i = 0; i < originalCount; i++) 
{ 
    ID.RemoveAt(0); 
} 

Đây là một O (n) hoạt động mặc dù, như loại bỏ một mục từ khi bắt đầu của danh sách liên quan đến việc sao chép mọi thứ khác.

một cách hiệu quả hơn (O (n)):

int count = ID.Count; 
for (int i = 0; i < originalCount; i++) 
{ 
    ID.RemoveAt(ID.Count - 1); 
} 

hoặc tương đương nhưng đơn giản hơn:

while (ID.Count > 0) 
{ 
    ID.RemoveAt(ID.Count - 1); 
} 

Nhưng sử dụng ID.Clear() có lẽ hiệu quả hơn so với tất cả trong số này, mặc dù nó cũng là O (n).

1

Mã của bạn không:

ID.RemoveAt(0); 
... 
ID.RemoveAt(9); 
ID.RemoveAt(10); \\ at this point you have already removed 10 
       \\ items so there is nothing left on 10- 19, but you are left with 
       \\ the 'first' 10 elements 
... 
ID.RemoveAt(19); 

Nói chung phương pháp bạn loại bỏ mọi yếu tố thứ hai trong danh sách ..

Sử dụng ArrayList.Clear thay vì như khác đã đề cập.

Các vấn đề liên quan