Sự khác biệt giữa Directory.Enum CảFiles so với Directory.GetFiles là gì?


145

Sự khác biệt giữa Directory.EnumerateFilesvs là GetFilesgì?

Rõ ràng một trả về một mảng và trả về một mảng khác.

Còn gì nữa không?

Câu trả lời:


173

Từ các tài liệu :

Các phương thức Enum CảFiles và GetFiles khác nhau như sau: Khi bạn sử dụng Enum CảFiles, bạn có thể bắt đầu liệt kê bộ sưu tập tên trước khi trả lại toàn bộ bộ sưu tập; Khi bạn sử dụng GetFiles, bạn phải đợi toàn bộ mảng tên được trả về trước khi bạn có thể truy cập vào mảng. Do đó, khi bạn đang làm việc với nhiều tệp và thư mục, Enum CảFiles có thể hiệu quả hơn.

Về cơ bản, EnumerateFilestrả về một IEnumerablecái có thể được đánh giá một cách lười biếng phần nào, trong khi GetFilestrả về một string[]cái phải được điền đầy đủ trước khi nó có thể trở lại.


5
Đánh giá lười biếng có thể không hoàn toàn miễn phí - ví dụ nếu bạn sẽ đưa nó trở lại một mảng cuối cùng (tôi đã thấy điều đó!). Lười biếng là hiệu quả khi "yagni" -tất cả: bạn sẽ không cần tất cả các yếu tố, và chỉ dừng lại sau một vài lần.
Tomasz Gandor

5
Liệt kê lười biếng cũng rất thú vị nếu bạn sắp liệt kê một bộ sưu tập lớn đến nỗi việc xây dựng toàn bộ bộ sưu tập đầu tiên trong bộ nhớ là quá nặng. Bạn chỉ có thể xử lý các mặt hàng khi chúng đến và quên chúng.
Stéphane Gourichon

1
@TomaszGandor: Hoặc khi không cần lưu trữ tất cả tên tệp, ví dụ như khi chỉ đổi tên tệp.
Sebastian Mach

Tôi đã xem xét các nguồn và thấy rằng cả hai phương pháp đều sử dụng nội bộ FileSystemEnumerableFactory.CreateFileInfoIterator(). Nhưng EnumerateFiles()trả về trình lặp này trực tiếp trong khi GetFiles()xây dựng thêm Listtừ nó và các cuộc gọi ToArray(). Vì vậy, nếu bạn quan tâm đến tốc độ thì nên sử dụng EnumerateFiles()và tự mình đối phó với trình vòng lặp.
C0DEF52

32

EnumerateFilestrả về IEnumerable<string>và điều đó hàm ý thực hiện hoãn lại. Nó chỉ có sẵn trong Fx4 trở lên.


2
Fx4 có nghĩa là gì?
Minh Nguyễn

3
.net FrameWork 4
Henk Holterman

11
Đó là một cái tên khác thường cho .NET 4.0
Snak

16

Khi sử dụng Enum CảFiles, tất cả tốc độ sẽ bị mất nếu bạn đang sử dụng .Last. Điều này có ý nghĩa tất nhiên, bởi vì để đến tệp cuối cùng, nó sẽ cần liệt kê tất cả các tệp, sau đó lấy tệp cuối cùng.

Tuy nhiên, sử dụng .Firsthoặc .FirstOrDefaulttrở nên rất nhanh, bởi vì nó chỉ đơn giản là lấy vật phẩm đầu tiên và tiếp tục.


6
Câu hỏi rất cũ này đã hỏi những điểm khác biệt ngoài khía cạnh Arrayvs. EnumerableCâu trả lời của bạn là chung cho tất cả các tình huống như vậy nhưng không trả lời câu hỏi được hỏi.
Ashigore

2
Vấn đề là, Enum CảFiles cho phép bạn bắt đầu truy cập dữ liệu nhanh hơn, trong một số trường hợp.
Skotte

16
Vấn đề là, điều này rất hữu ích như một nhận xét nhưng nó không trả lời câu hỏi. Có một sự phân biệt.
djv
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.