Gần đây, tôi đã viết rất nhiều mã mà trông như thế này:Việc xóa các mục khỏi Danh sách C# <T> có giữ lại các đơn hàng khác không?
List<MyObject> myList = new List<MyObject>();
...
for(int i = 0; i < myList.Count; ++i)
{
if(/*myList[i] meets removal criteria*/)
{
myList.RemoveAt(i);
--i; //Check this index again for the next item
//Do other stuff as well
}
}
và tôi chỉ trở thành một chút hoang tưởng rằng có lẽ Danh sách không giữ lại để đối tượng ở loại bỏ. Tôi không biết C# spec cũng đủ để biết chắc chắn. Ai đó có thể xác minh rằng tôi hoặc là sáng hoặc không yêu cầu sự cố với mẫu này?
EDIT: Có lẽ tôi nên làm rõ rằng ở trên là một ví dụ rất đơn giản và nhiều điều hơn xảy ra nếu mục cần phải được loại bỏ vì vậy tôi không nghĩ rằng List<T>.RemoveAll()
là áp dụng khủng khiếp ở đây. Mặc dù nó là một chức năng tốt đẹp. Tôi đã thêm nhận xét trong khối if()
ở trên để đề cập cụ thể điều đó.
Một lưu ý phụ: Bạn nên lặp qua danh sách ngược thay vì chuyển tiếp. Giả sử bạn xóa danh sách [1] (i = 1). Điều này sẽ làm cho danh sách thay đổi, trong đó phần tử trong danh sách [2] hiện nằm trong danh sách [1]. Bây giờ khi bạn chuyển sang i = 2, bạn đã bỏ qua phần tử hiện nằm trong danh sách [1]. –
Bạn sẽ có thể đơn giản hóa rất nhiều mẫu này bằng phương thức RemoveAll() –
Tại sao bạn không sử dụng LINQ cho điều đó? – Andre