Làm thế nào để làm trống một danh sách trong C #?


109

Tôi muốn làm trống một danh sách. Làm thế nào để làm điều đó?


34
Thời gian phản ứng ở đây là nhanh hơn so với nó đã có để đọc / tìm kiếm MSDN
V4Vendetta

27
Thêm vào đó, câu trả lời hiện dễ dàng tìm thấy ở đây hơn MSDN.
Matt Connolly

14
Chưa kể thực tế là nếu bạn Google .net empty list, trang này xuất hiện trước MSDN!
Vivian River

2
@ V4Vendetta Trong năm 2018, tôi sẽ đề nghị rằng StackOverflow lẽ nên tạo một Bot mà đưa xét của bạn về bất kỳ chủ đề đó có một liên kết đến MSDN doc trong các ý kiến ...
scharette

Câu trả lời:


234

Nó thực sự dễ dàng:

myList.Clear();

3
... nếu danh sách thực sự là một List<>, ArrayListhoặc dụng cụ IList. ;)
Lucero

3
@Lucero có được gọi là danh sách không nếu nó không phải là một trong số đó?
Srinivas Reddy Thatiparthy

16
Vì đây là một hit hàng đầu trong google và tôi gặp phải vấn đề này, tôi muốn nhận xét điều này. Nếu bạn sử dụng cùng một danh sách trong một vòng lặp và sử dụng clear, danh sách thường sẽ giữ tham chiếu đến các đối tượng cũ - Tôi thường kết thúc bằng cách sử dụng = new LisT <T> (); do thực tế là nó xóa tất cả các phân bổ cũ ngay lập tức. Tuy nhiên, đối với hầu hết mọi người, .Clear (); sẽ đủ, nhưng nếu bạn thấy một danh sách hoạt động lạ - hãy thử sử dụng = new List <T> () ;.
Charles

1
Tôi sẽ phân bổ gấp đôi điều này vì một số thông tin sai lệch đã được cung cấp ở đây kể từ năm 2020. List<T>.Clearxóa đúng cách tất cả các tham chiếu cho phép GC xóa phân bổ khi cần thiết. new List<T>KHÔNG làm điều này và không phù hợp một cách hiệu quả trong tất cả các tình huống
John

28

Nếu theo "danh sách" bạn có nghĩa là a List<T>, thì phương thức Clear là những gì bạn muốn:

List<string> list = ...;
...
list.Clear();

Bạn nên có thói quen tìm kiếm tài liệu MSDN về những thứ này.

Dưới đây là cách nhanh chóng tìm kiếm tài liệu về các bit khác nhau của loại đó:

Tất cả các truy vấn này của Google liệt kê một nhóm các liên kết, nhưng thông thường bạn muốn liên kết đầu tiên mà google cung cấp cho bạn trong mỗi trường hợp.


"Tất cả những thứ này liệt kê một nhóm liên kết, nhưng thông thường bạn muốn cái đầu tiên." Trừ khi bạn muốn làm trống danh sách?
CVn

Xin lỗi, tôi nên nói rõ hơn. Bạn thường muốn liên kết đầu tiên mà Google cung cấp cho bạn, không phải "Loại danh sách".
Lasse V. Karlsen

9

Để đưa ra một câu trả lời thay thế (Ai cần 5 câu trả lời bằng nhau?):

list.Add(5); 
// list contains at least one element now
list = new List<int>();
// list in "list" is empty now

Hãy nhớ rằng tất cả các tham chiếu khác đến danh sách cũ vẫn chưa bị xóa (tùy thuộc vào tình huống, đây có thể là những gì bạn muốn). Ngoài ra, về hiệu suất, nó thường chậm hơn một chút.


Bạn có thể xác minh rằng thiết lập list = new List <> () thực sự chậm hơn list.Clear ();? Theo MSDN (liên kết bên dưới) list.Clear (); là một phép toán O (N) và tôi không thể tưởng tượng việc tạo một danh sách mới sẽ mất nhiều thời gian hơn thế. msdn.microsoft.com/en-us/library/dwb5h52a(v=vs.110).aspx
Chris Tramel

5
DotNetPerls đã thực hiện một điểm chuẩn và nhận thấy rằng Danh sách mới <> nhanh hơn. dotnetperls.com/list-clear
Gerhard Powell,

Theo phần mở rộng, hãy lưu ý rằng listcó một tham chiếu mới. Vì vậy, không sử dụng điều đó nếu bạn đang sử dụng một ổ khóa trong danh sách đó.
jeromej 17/07/18

9

Tùy chọn # 1: Sử dụng hàm Clear () để làm trống List<T>và giữ lại dung lượng của nó.

  • Đếm được đặt thành 0 và các tham chiếu đến các đối tượng khác từ các phần tử của bộ sưu tập cũng được phát hành.

  • Dung lượng vẫn không thay đổi.

Tùy chọn # 2 - Sử dụng các hàm Clear ()TrimExcess () để đặt List<T>về trạng thái ban đầu.

  • Đếm được đặt thành 0 và các tham chiếu đến các đối tượng khác từ các phần tử của bộ sưu tập cũng được phát hành.

  • Việc cắt bỏ phần trống List<T>đặt dung lượng của Danh sách thành dung lượng mặc định.

Định nghĩa

Đếm = số phần tử thực sự có trongList<T>

Dung lượng = tổng số phần tử mà cấu trúc dữ liệu bên trong có thể chứa mà không cần thay đổi kích thước.

Clear () Chỉ

List<string> dinosaurs = new List<string>();    
dinosaurs.Add("Compsognathus");
dinosaurs.Add("Amargasaurus");
dinosaurs.Add("Deinonychus");
Console.WriteLine("Count: {0}", dinosaurs.Count);
Console.WriteLine("Capacity: {0}", dinosaurs.Capacity);
dinosaurs.Clear();
Console.WriteLine("\nClear()");
Console.WriteLine("\nCount: {0}", dinosaurs.Count);
Console.WriteLine("Capacity: {0}", dinosaurs.Capacity);

Clear () và TrimExcess ()

List<string> dinosaurs = new List<string>();
dinosaurs.Add("Triceratops");
dinosaurs.Add("Stegosaurus");
Console.WriteLine("Count: {0}", dinosaurs.Count);
Console.WriteLine("Capacity: {0}", dinosaurs.Capacity);
dinosaurs.Clear();
dinosaurs.TrimExcess();
Console.WriteLine("\nClear() and TrimExcess()");
Console.WriteLine("\nCount: {0}", dinosaurs.Count);
Console.WriteLine("Capacity: {0}", dinosaurs.Capacity);

5

bạn có thể làm điều đó

var list = new List<string>();
list.Clear();

5

Bạn có thể sử dụng phương pháp rõ ràng

List<string> test = new List<string>();
test.Clear();

4

Bạn cần có hàm Clear () trong danh sách, như vậy.

List<object> myList = new List<object>();

myList.Add(new object()); // Add something to the list

myList.Clear() // Our list is now empty
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.