Rất lâu tôi cần một cái gì đó như thế:Thực tiễn tốt nhất để tránh InvalidOperationException: Bộ sưu tập đã được sửa đổi?
foreach (Line line in lines)
{
if (line.FullfilsCertainConditions())
{
lines.Remove(line)
}
}
này không làm việc, bởi vì tôi luôn có được một InvalidOperationException
vì Enumerator được thay đổi trong vòng lặp.
Vì vậy, tôi đã thay đổi tất cả các vòng của tôi thuộc loại này như sau:
List<Line> remove = new List<Line>();
foreach (Line line in lines)
{
if (line.FullfilsCertainConditions())
{
remove.Add(line)
}
}
foreach (Line line in remove) {
{
lines.Remove(line);
}
Tôi không chắc chắn nếu điều này thực sự là cách tốt nhất vì trong trường hợp xấu nhất tôi phải lặp 2 lần so với ban đầu danh sách và vì vậy nó cần thời gian 2n thay vì n.
Có cách nào tốt hơn để thực hiện việc này không?
EDIT:
tôi đã có thể làm điều đó bằng câu trả lời của Mark Nhưng nếu bộ sưu tập của tôi không cụ RemoveAll()?
Ví dụ một
System.Windows.Controls.UIElementCollection
EDIT 2:
Một lần nữa với sự giúp đỡ của Mark Tôi bây giờ có thể thực hiện cuộc gọi sau đây để loại bỏ tất cả ScatterViewItems:
CollectionUtils.RemoveAll(manager.getWindow().IconDisplay.Items, elem => elem.GetType() == typeof(ScatterViewItem));
tôi gặp vấn đề tương tự một thời gian trước và không có giải pháp. Nó thậm chí còn tồi tệ hơn - nó không phải là 2n nhưng n^2 vì 'dòng.Remove (dòng)' lặp lại một lần nữa trên bộ sưu tập. – Matten
Nhưng O (2n) bằng O (n) :-) thực sự: Trong Java, bạn có thể sử dụng Iterator để thực hiện việc này hoặc thực hiện việc thực hiện Sao chép ghi trên bản ghi cho phép sửa đổi trong khi lặp lại. – Waldheinz
Cập nhật lại - xem chỉnh sửa của tôi –