Danh sách .NET <T> Concat so với AddRange


Câu trả lời:


122

Chúng có ngữ nghĩa hoàn toàn khác nhau.

AddRange sửa đổi danh sách bằng cách thêm các mục khác vào đó.

Concat trả về một chuỗi mới chứa danh sách và các mục khác, mà không sửa đổi danh sách.

Chọn bất kỳ cái nào có ngữ nghĩa bạn muốn.


1
Vì vậy, ion là một vòng lặp chặt chẽ, sẽ tốt hơn nhiều nếu sử dụng thêm phạm vi để không bị mất hiệu suất do tất cả nội bộ mới và đập GC?
johnc 19-08

43
Trên thực tế, do thực thi trì hoãn, sử dụng Concat có thể sẽ nhanh hơn vì nó tránh được việc phân bổ đối tượng - Concat không sao chép bất kỳ thứ gì, nó chỉ tạo liên kết giữa các danh sách để khi liệt kê và bạn đến cuối một danh sách, nó sẽ đưa bạn bắt đầu một cách rõ ràng. của tiếp theo!
Greg Beech 19-08

36

Sự khác biệt lớn là AddRange thay đổi danh sách đó mà nó được gọi trong khi Concat tạo một Danh sách mới. Do đó chúng có những cách sử dụng khác nhau.

Ngoài ra, Concat là một phương thức mở rộng áp dụng cho bất kỳ IEnumerable nào và trả về IEnumerable mà bạn cần có .ToList () để dẫn đến một Danh sách mới.

Nếu bạn muốn mở rộng nội dung của danh sách hiện có, hãy sử dụng AddRange.

Nếu bạn đang tạo một danh sách mới từ hai nguồn IEnumerable thì hãy sử dụng Concat với .ToList. Điều này có chất lượng mà nó không thay đổi một trong hai nguồn.

Nếu bạn chỉ cần liệt kê nội dung của hai Danh sách (hoặc bất kỳ IEnumerable nào khác) thì chỉ cần sử dụng Concat mỗi lần, điều này có lợi thế là không thực sự phân bổ bộ nhớ mới để giữ danh sách thống nhất.


3
+1, Trên thực tế, nếu bạn quên 'ToList', concat âm thầm không có gì
smirkingman

7

Tôi thấy bài viết thú vị này nói về sự khác biệt giữa 2 cấu trúc này và so sánh hiệu suất của chúng ...

Ý tưởng chính là AddRange nhanh hơn nhiều so với các bộ sưu tập kích thước lớn.

Đây là liên kết

Hi vọng điêu nay co ich,


1
Tôi đã thực hiện một thử nghiệm so sánh ConcatAddRangevới một List<KeyValuePair<string, string>>với 1000 phần tử, được nối / thêm vào 100 lần và AddRangecực kỳ nhanh hơn. Kết quả thu được sau đây: AddRange13 ms, Concat().ToList()16.000 ms, và Concattrên một IEnumerablechỉ làm ToListở cuối: 2.700 ms.
Andrew
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.