.NET List <T> Concat เทียบกับ AddRange


คำตอบ:


123

พวกเขามีความหมายที่แตกต่างกันโดยสิ้นเชิง

AddRange แก้ไขรายการโดยการเพิ่มรายการอื่น ๆ

Concat ส่งคืนลำดับใหม่ที่มีรายการและรายการอื่น ๆ โดยไม่ต้องแก้ไขรายการ

เลือกข้อใดก็ได้ที่มีความหมายที่คุณต้องการ


1
ดังนั้นไอออนเป็นวงที่แน่นมันจะดีกว่ามากถ้าใช้ add range เพื่อไม่ให้สูญเสียประสิทธิภาพเนื่องจากการสร้างใหม่ภายในและการทุบ GC
johnc

45
อันที่จริงเนื่องจากการดำเนินการรอการตัดบัญชีการใช้ Concat น่าจะเร็วกว่าเพราะหลีกเลี่ยงการจัดสรรอ็อบเจ็กต์ - Concat ไม่ได้คัดลอกอะไรเลยเพียงแค่สร้างลิงก์ระหว่างรายการดังนั้นเมื่อแจกแจงและคุณไปถึงจุดสิ้นสุดของรายการคุณจะเริ่มต้นอย่างโปร่งใส ของต่อไป!
Greg Beech

36

ความแตกต่างที่สำคัญคือ AddRange กลายพันธุ์รายการนั้นกับรายการที่เรียกว่าในขณะที่ Concat สร้างรายการใหม่ ดังนั้นจึงมีการใช้งานที่แตกต่างกัน

นอกจากนี้ Concat เป็นวิธีการขยายที่ใช้กับ IEnumerable และส่งคืน IEnumerable ที่คุณต้องมี. toList () เพื่อให้ได้รายการใหม่

หากคุณต้องการขยายเนื้อหาของรายการที่มีอยู่ให้ใช้ AddRange

หากคุณกำลังสร้างรายการใหม่จากแหล่งที่มาของ IEnumerable สองแหล่งให้ใช้ Concat กับ. toList สิ่งนี้มีคุณภาพที่ไม่กลายพันธุ์จากแหล่งใดแหล่งหนึ่ง

หากคุณต้องการเพียงแค่ระบุเนื้อหาของสอง Lists (หรือ IEnumerable อื่น ๆ ) ให้ใช้ Concat ทุกครั้งสิ่งนี้มีข้อดีคือไม่ได้จัดสรรหน่วยความจำใหม่เพื่อเก็บรายการที่เป็นหนึ่งเดียว


3
+1 แน่นอนถ้าคุณลืม 'tolist' การเชื่อมต่ออย่างเงียบ ๆ ก็ไม่ทำอะไรเลย
smirkingman

7

ฉันพบบทความที่น่าสนใจนี้พูดถึงความแตกต่างระหว่างโครงสร้างทั้ง 2 นี้และเปรียบเทียบประสิทธิภาพ ...

แนวคิดหลักคือ AddRange เร็วกว่ามากเมื่อเกี่ยวกับคอลเลกชันขนาดใหญ่

นี่คือลิงค์

หวังว่านี่จะช่วยได้


1
ฉันได้ทำการทดสอบเปรียบเทียบConcatและAddRangeมีList<KeyValuePair<string, string>>1000 องค์ประกอบตัดแบ่ง / เพิ่ม 100 ครั้งและAddRangeเป็นมากได้เร็วขึ้น ผลลัพธ์มีดังนี้AddRange13 ms, Concat().ToList()16,000 ms และConcatเมื่อIEnumerableทำเฉพาะToListตอนท้าย: 2,700 ms
Andrew
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.