Directory.EnumerateFiles vs Directory.GetFiles แตกต่างกันอย่างไร


146

ข้อแตกต่างระหว่างDirectory.EnumerateFilesvs GetFilesคืออะไร?

เห็นได้ชัดว่าหนึ่งส่งกลับอาร์เรย์และผลตอบแทนอื่น ๆ นับได้

มีอะไรอีกไหม

คำตอบ:


173

จากเอกสาร :

กระบวนการ EnumerateFiles และ GetFiles แตกต่างกันดังนี้: เมื่อคุณใช้ EnumerateFiles คุณสามารถเริ่มระบุคอลเลกชันของชื่อก่อนที่จะส่งกลับคอลเลกชันทั้งหมด เมื่อคุณใช้ GetFiles คุณต้องรอให้ชื่อทั้งหมดกลับคืนมาก่อนจึงจะสามารถเข้าถึงอาร์เรย์ได้ ดังนั้นเมื่อคุณทำงานกับไฟล์และไดเรกทอรีจำนวนมาก EnumerateFiles จะมีประสิทธิภาพมากกว่า

ดังนั้นโดยทั่วไปแล้วEnumerateFilesคืนค่าIEnumerableที่สามารถประเมินค่อนข้างขี้เกียจในขณะที่GetFilesผลตอบแทนที่จะstring[]ต้องมีประชากรอย่างเต็มที่ก่อนที่จะสามารถกลับมา


5
การประเมินที่ขี้เกียจอาจไม่มาฟรีอย่างสมบูรณ์ - ตัวอย่างเช่นถ้าคุณจะเอามันกลับไปที่อาร์เรย์ในตอนท้าย (ฉันเห็นอย่างนั้น!) Lazy นั้นมีประสิทธิภาพเมื่อ "yagni" - ทั้งหมด: คุณไม่ต้องการองค์ประกอบทั้งหมดและเพียงแค่หยุดการทำซ้ำหลังจากนั้นไม่กี่
Tomasz Gandor

5
การนับจำนวนขี้เกียจก็น่าสนใจเช่นกันหากคุณกำลังจะระบุคอลเล็กชันขนาดใหญ่ที่สร้างคอลเล็กชั่นทั้งหมดก่อนในหน่วยความจำหนักเกินไป คุณสามารถประมวลผลรายการตามที่พวกเขามาและลืมพวกเขา
Stéphane Gourichon

1
@TomaszGandor: หรือเมื่อไม่จำเป็นต้องเก็บชื่อไฟล์ทั้งหมดเช่นเมื่อเพียงแค่เปลี่ยนชื่อไฟล์
เซบาสเตียนมัค

FileSystemEnumerableFactory.CreateFileInfoIterator()ผมมองเข้าไปในแหล่งที่มาและพบว่าทั้งสองวิธีใช้ภายใน แต่EnumerateFiles()ผลตอบแทนที่ได้ iterator นี้โดยตรงในขณะที่GetFiles()สร้างเสริมจากมันและโทรList ToArray()ดังนั้นถ้าคุณสนใจความเร็วมันสมเหตุสมผลที่จะใช้EnumerateFiles()และจัดการกับ iterator ด้วยตัวคุณเอง
C0DEF52

32

EnumerateFilesผลตอบแทนIEnumerable<string>และที่หมายถึงการดำเนินการรอการตัดบัญชี มันมีเฉพาะใน Fx4 ขึ้นไป


2
Fx4 หมายถึงอะไร
Minh Nguyen

3
.net FrameWork 4
Henk Holterman

11
เป็นชื่อที่ผิดปกติสำหรับ. NET 4.0
Snak

16

เมื่อใช้ EnumerateFiles .Lastความเร็วทั้งหมดจะหายไปถ้าคุณกำลังใช้แล้ว วิธีนี้เหมาะสมสำหรับการไปยังไฟล์สุดท้ายเพราะจะต้องระบุไฟล์ทั้งหมดแล้วจึงเลือกไฟล์สุดท้าย

อย่างไรก็ตามการใช้.Firstหรือ.FirstOrDefaultกลายเป็นอย่างรวดเร็วเพราะมันคว้ารายการแรกและย้ายไป


6
คำถามเก่านี้ถามว่ามีความแตกต่างนอกเหนือจากด้านArrayvs Enumerableคำตอบของคุณเป็นเรื่องทั่วไปสำหรับทุกสถานการณ์ดังกล่าว แต่ไม่ตอบคำถามที่ถาม
Ashigore

2
ประเด็นคือ EnumerateFiles ช่วยให้คุณเริ่มเข้าถึงข้อมูลได้เร็วขึ้นในบางกรณี
Skotte

16
ประเด็นก็คือมันมีประโยชน์มากในฐานะที่เป็นความคิดเห็น แต่ไม่ตอบคำถาม มีความแตกต่าง
djv
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.