Phương thức List<T>.Remove(T)
hoặc List<T>.RemoveAt(int)
trong bộ sưu tập .NET có nhanh hơn không? Tốc độ khác nhau đối với các loại giá trị hoặc loại tham chiếu?Phương pháp này có nhanh hơn trong Danh sách <T> .Xóa (T) hoặc Danh sách <T> .RemoveAt (int)?
Trả lời
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;
}
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ì?
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.
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
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.
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.
- 1. Truy vấn danh sách <T> hoặc cơ sở dữ liệu có nhanh hơn không?
- 2. Danh sách <int> trong C#
- 3. Tra cứu nhanh Danh sách <T>
- 4. xóa các mục khỏi Danh sách chung <t>
- 5. Kiểm tra int hoặc danh sách <int>
- 6. Danh sách <T> bị xóa sự cố
- 7. Đếm các phần tử có int <5 trong Danh sách <T>
- 8. Cách nhanh hơn để thực hiện Danh sách <T> .Contains()
- 9. Danh sách <T> đồng thời xóa và thêm
- 10. C# Danh sách <T> vs IEnumerable <T> hiệu suất câu hỏi
- 11. Danh sách Hiệu suất SqlDataReader <string[]> hoặc Danh sách <object[]>
- 12. C# Danh sách chuyển đổi <int> thành Danh sách <double>
- 13. shuffle Danh sách <T>
- 14. Tại sao có Danh sách <T> .BinarySearch (...)?
- 15. danh sách <int> chuyển đổi sang int []
- 16. chuyển đổi danh sách <int> thành danh sách <long>
- 17. Có thể sử dụng Danh sách <T> .Contains (...)?
- 18. Danh sách <int> khởi tạo trong C# 3.5
- 19. Tổng số lượng int trong Danh sách <int>
- 20. Sự khác biệt giữa Danh sách <T> và Danh sách <object>?
- 21. Loại động cho Danh sách <T>?
- 22. Điều gì là tĩnh <T> Danh sách <T> phương thứcName (Danh sách <? super T> đầu vào)
- 23. Làm thế nào để có được IEnumerable <T> từ Danh sách <T>?
- 24. Sắp xếp một Dictionary <int, Danh sách <int>> bằng phím + giá trị bên trong danh sách
- 25. C# Mở rộng Flat Danh sách <T> để Dictionary <T, ICollection <int>>
- 26. Không thể (hoặc có thể) vào Danh sách <int> .Cast <Enum>()?
- 27. Chuyển đổi IEnumerable trong Danh sách <T>
- 28. Chuyển đổi 'ArrayList' thành 'Danh sách <string>' (hoặc 'Danh sách <T>') bằng LINQ
- 29. Lỗi với T :: iterator, trong đó tham số mẫu T có thể là vector <int> hoặc danh sách <int>
- 30. Làm cách nào để tạo Danh sách <T> từ một SortedList <int, T>?
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). –
'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