2010-07-09 25 views

Trả lời

15

List.Remove (T) sử dụng IndexOf và RemoveAt (int) trong quá trình triển khai. Vì vậy, List.RemoveAt (int) là nhanh hơn.

public bool Remove(T item) 
{ 
    int index = this.IndexOf(item); 
    if (index >= 0) 
    { 
     this.RemoveAt(index); 
     return true; 
    } 
    return false; 
} 
+0

Nhưng nếu nó làm cho mã của bạn tồi tệ nhất hoặc không đọc được, cũng có thể tiếp tục sử dụng Remote (T). –

+0

'this.IndexOf (mục)' mã có một mức giá rất lớn về hiệu suất vì nó quét toàn bộ mảng sao lưu cho đến khi nó được mục sẽ bị xóa. Đặc biệt khi mục bị xóa nằm ở cuối danh sách, nó sẽ quét toàn bộ danh sách mỗi lần yêu cầu xóa. Nó xảy ra với tôi khi tôi đang cố gắng thực hiện một cấu trúc dữ liệu ngăn xếp với sự giúp đỡ của một lớp 'List '. Vì kích thước danh sách tăng đáng kể, ví dụ: vượt quá 10K yếu tố, việc xóa từ cuối bằng cách sử dụng Remove (T) có thể phá hoại sự tàn phá với chương trình của bạn. – RBT

0

Remove (T) làm cho nội bộ một cuộc gọi đến RemoveAt (int) như vậy, làm trực tiếp một removeAt là nhanh hơn.

Nhưng bạn muốn đạt được điều gì?

19

câu trả lời đơn giản:

Nói chung, RemoveAt là nhanh hơn, mặc dù không phải lúc nào cũng vô cùng.

Long trả lời:

Hãy chỉ xem xét việc tìm kiếm mục thích hợp đầu tiên. Phương pháp Remove phải tìm kiếm danh sách cho mục phù hợp với đối tượng đã cho, và do đó là O(n) thời gian nói chung. RemoveAt trên danh sách có thể chỉ cần lập chỉ mục mục đã cho và do đó là O(1).

Bây giờ, việc xóa một mục từ cuối danh sách luôn là O(1) tất nhiên, nhưng nói chung việc xóa một mục mất O(n) thời gian, vì cần phải thực hiện thay đổi (di chuyển các mục sau khi chuyển đi). Do đó, trong trường hợp chung, tổng thời gian phức tạp để xóa là O(n) + O(n) hoặc O(n) + O(1) cho Remove và RemoveAt tương ứng, do đó chỉ đơn giản là O(n) trong cả hai trường hợp. Tuy nhiên, RemoveAt được đảm bảo ít nhất là nhanh chóng, mặc dù tỷ lệ là giống nhau trừ khi bạn biết bạn đang xóa nó tại/gần cuối.

+0

Cảm ơn, bây giờ tôi hiểu lý do tại sao MSDN nói rằng RemoveAt là O (n) trong đó n là Count-index – Yellowfog

0

Sử dụng System.Diagnostics.Stopwatch()

Tôi vừa tạo một ứng dụng bảng điều khiển nhỏ để kiểm tra xem ứng dụng nào nhanh hơn.

0

Giả sử rằng .Net đang lây nhiễm một vectơ (hoặc mảng), không phải là một danh sách được liên kết, RemoveAt() sẽ nhanh hơn.

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