2012-04-02 77 views
14

Tôi muốn xóa tất cả các yếu tố từ danh sách của tôi:Xóa tất cả các mục từ một danh sách

foreach (Session session in m_sessions) 
{ 
    m_sessions.Remove(session); 
} 

Trong yếu tố cuối cùng tôi nhận được một ngoại lệ: UnknownOperation.

Bất cứ ai cũng biết tại sao?

Tôi nên xóa tất cả các phần tử như thế nào? Nó là ok để viết một cái gì đó như thế này:

m_sessions = new List<Session>(); 
+9

'm_Sessions.Clear()'? –

+0

thử list.Clear(). –

+0

Bạn có chắc chắn rằng bạn có được tất cả các cách để các yếu tố cuối cùng, tôi sẽ nghĩ rằng bạn sẽ nhận được một ngoại lệ về nỗ lực đầu tiên để sửa đổi một danh sách được sử dụng cho iteration – musefan

Trả lời

24

Bạn không được phép sửa đổi một List<T> trong khi iterating trên nó với foreach. Sử dụng m_sessions.Clear() để thay thế.

Trong khi bạn có thể viết m_sessions = new List<Session>() thì đây không phải là ý hay. Để bắt đầu, thật lãng phí khi tạo một danh sách mới chỉ để xóa một danh sách hiện có. Hơn nữa, nếu bạn có tài liệu tham khảo khác vào danh sách sau đó họ sẽ tiếp tục tham khảo danh sách cũ. Mặc dù, như @dasblinkenlight chỉ ra, m_sessions có thể là thành viên riêng tư và bạn không chắc có các tham chiếu khác trong danh sách. Không có vấn đề, Clear() là cách kinh điển để xóa một số List<T>.

+0

chính xác cuối cùng, với trình vòng lặp danh sách, bạn có thể sửa đổi danh sách một cách an toàn trong khi duyệt qua nó. Các Iterator biết về các nút trước đó/tiếp theo và được thiết kế để sửa đổi. Tiêu chuẩn cho các macro vòng lặp và trong khi các vòng lặp thì không. –

+0

+1 Tuy nhiên, giả sử rằng 'm_' là viết tắt của * member *, và rằng nó cũng là riêng tư, có các tham chiếu khác tới' m_sessions' sẽ chỉ ra các vấn đề ở mức độ sâu hơn. – dasblinkenlight

+0

Tại sao m_sessions = new ..; (hoặc m_sessions = null cho rằng vấn đề, đó là những gì tôi đọc vào này) thực sự rõ ràng trong danh sách? –

8

Không bao giờ, sửa đổi bộ sưu tập đang được lặp lại với foreach. Chèn, xóa và sắp xếp lại là không có. Tuy nhiên, bạn có thể sửa đổi biến số foreach (session trong trường hợp này).

Trong trường hợp này, sử dụng

m_sessions.Clear(); 

và loại bỏ các vòng lặp.

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