2008-09-19 27 views

Trả lời

94

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 danh sách.

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 tùy chọn nào có ngữ nghĩa bạn muốn.

+0

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

+33

Trên thực tế, do việc thực hiện trì hoãn, việc sử dụng Concat có thể nhanh hơn vì nó * tránh phân bổ đối tượng - Concat không sao chép bất cứ thứ gì. Nó chỉ tạo liên kết giữa các danh sách để liệt kê và bạn kết thúc một danh sách để bắt đầu tiếp theo! –

28

Sự khác biệt lớn nhất là các đột biến AddRange liệt kê mà nó được gọi trong khi Concat tạo một Danh sách mới. Do đó họ có cách sử dụng khác nhau.

Ngoài ra Concat là một phương pháp mở rộng áp dụng cho bất kỳ IEnumerable và trả về một IEnumerable bạn cần một .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 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 biến đổ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 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 phân bổ bộ nhớ mới để giữ danh sách hợp nhất.

+0

+1, Thật vậy, nếu bạn quên 'tha thứ', concat lặng lẽ không làm gì cả – smirkingman