Các loại IEnumerable<T>
không hỗ trợ các hoạt động như vậy. Mục đích của IEnumerable<T>
giao diện là cho phép người tiêu dùng xem nội dung của bộ sưu tập. Không sửa đổi các giá trị.
Khi bạn thực hiện các thao tác như .ToList (). Add () bạn đang tạo mới List<T>
và thêm một giá trị vào danh sách đó. Nó không có kết nối với danh sách ban đầu.
Những gì bạn có thể làm là sử dụng phương pháp Thêm tiện ích mở rộng để tạo mới IEnumerable<T>
với giá trị gia tăng.
items = items.Add("msg2");
Ngay cả trong trường hợp này, nó sẽ không sửa đổi IEnumerable<T>
đối tượng ban đầu . Điều này có thể được xác nhận bằng cách giữ một tài liệu tham khảo đến nó. Ví dụ
var items = new string[]{"foo"};
var temp = items;
items = items.Add("bar");
Sau tập hợp hoạt động này, temp biến vẫn sẽ chỉ tham chiếu một liệt kê với một phần tử duy nhất "foo" trong tập hợp các giá trị trong khi các mục sẽ tham chiếu một liệt kê khác với các giá trị "foo" và "bar".
BIÊN TẬP
Tôi tình cờ quên rằng Add không phải là một phương thức mở rộng điển hình IEnumerable<T>
vì đó là một trong những phương thức đầu tiên mà cuối cùng tôi xác định. Nó đây rồi
public static IEnumerable<T> Add<T>(this IEnumerable<T> e, T value) {
foreach ( var cur in e) {
yield return cur;
}
yield return value;
}
IEnumerable<T>
chỉ dành cho truy vấn bộ sưu tập. Nó là xương sống cho khung LINQ. Nó luôn luôn là một sự trừu tượng của một số bộ sưu tập khác nhưCollection<T>
,List<T>
hoặcArray
. Giao diện chỉ cung cấp mộtGetEnumerator
phương thức trả về một thểIEnumerator<T>
hiện cho phép đi bộ của bộ sưu tập mở rộng một mục tại một thời điểm. Các phương thức mở rộng LINQ bị giới hạn bởi giao diện này.IEnumerable<T>
được thiết kế để chỉ đọc bởi vì nó có thể đại diện cho một tập hợp các phần của nhiều bộ sưu tập.