Tôi muốn tạo một phiên bản mới của một đối tượng IEnumerable<object>
Tôi có thể làm điều này?
IEnumerable<object> a = new IEnumerable<object>();
Tôi muốn tạo một phiên bản mới của một đối tượng IEnumerable<object>
Tôi có thể làm điều này?
IEnumerable<object> a = new IEnumerable<object>();
IEnumerable<T>. Bạn phải sử dụng một cái gì đó như thế nào List<T>.
IEnumerable<T>nó không đại diện cho một trình lặp - nó đại diện cho một chuỗi có thể lặp lại . IEnumerator<T>chính nó đại diện cho trình lặp.
Câu trả lời:
Ví dụ, bạn có thể tạo một phiên bản của List<object>, thực hiện IEnumerable<object>. Thí dụ:
List<object> list = new List<object>();
list.Add(1);
list.Add(4);
list.Add(5);
IEnumerable<object> en = list;
CallFunction(en);
IEnumerable<T>là một ý tưởng tồi IMO.
Vì bây giờ bạn đã chỉ định bạn muốn thêm vào nó, những gì bạn muốn không phải là đơn giản IEnumerable<T>nhưng ít nhất là một ICollection<T>. Tôi khuyên bạn nên sử dụng một cách đơn giản List<T>như sau:
List<object> myList=new List<object>();
myList.Add(1);
myList.Add(2);
myList.Add(3);
Bạn có thể sử dụng myList ở mọi nơi IEnumerable<object>mà bạn mong đợi, vì List<object>triển khaiIEnumerable<object> .
(câu trả lời cũ trước khi làm rõ)
Bạn không thể tạo một phiên bản IEnumerable<T>vì đó là một giao diện bình thường (Đôi khi có thể chỉ định một triển khai mặc định, nhưng điều đó thường chỉ được sử dụng với COM).
Vì vậy, những gì bạn thực sự muốn là khởi tạo một lớp thực hiện giao diện IEnumerable<T> . Hành vi khác nhau tùy thuộc vào lớp bạn chọn.
Đối với một trình tự trống, hãy sử dụng:
IEnumerable<object> e0=Enumerable.Empty<object>();
Đối với một liệt kê không trống, bạn có thể sử dụng một số bộ sưu tập có triển khai IEnumerable<T>. Sự lựa chọn phổ biến là mảng T[], List<T>hoặc nếu bạn muốn tính bất biến ReadOnlyCollection<T>.
IEnumerable<object> e1=new object[]{1,2,3};
IEnumerable<object> e2=new List<object>(){1,2,3};
IEnumerable<object> e3=new ReadOnlyCollection(new object[]{1,2,3});
Một cách phổ biến khác để triển khai IEnumerable<T>là tính năng trình lặp được giới thiệu trong C # 3:
IEnumerable<object> MyIterator()
{
yield return 1;
yield return 2;
yield return 3;
}
IEnumerable<object> e4=MyIterator();
Một giải pháp khác sẽ được sử dụng Empty.
IEnumerable<object> a = Enumerable.Empty<object>();
có một chủ đề trên SO về nó: Có phải tốt hơn là sử dụng Enumerable.Empty () thay vì List mới để khởi tạo IEnumerable không?
Không, bạn không thể vì IEnumerablelà một giao diện.
Bạn sẽ có thể tạo một phiên bản trống của hầu hết các kiểu không phải giao diện triển khai IEnumerable, ví dụ: -
IEnumerable<object> a = new object[] { };
hoặc là
IEnumerable<object> a = new List<object>();
Không, bạn không thể làm điều đó. Sử dụng dòng mã sau để thay thế:
IEnumerable<int> usersIds = new List<int>() {1, 2, 3}.AsEnumerable();
Tôi hy vọng nó sẽ giúp.
Tôi muốn tạo một đối tượng hoặc danh sách có thể liệt kê mới và có thể thêm vào nó.
Nhận xét này thay đổi mọi thứ. Bạn không thể thêm vào chung chung IEnumerable<T>. Nếu bạn muốn ở lại với các giao diện trong System.Collections.Generic, bạn cần sử dụng một lớp thực hiện ICollection<T>như List<T>.
Không có IEnumerable là một giao diện, bạn không thể tạo phiên bản của giao diện
bạn có thể làm một cái gì đó như thế này
IEnumerable<object> a = new object[0];
new SomeComInterface()khởi tạo "CoClass" liên quan của giao diện hơn là khởi tạo chính giao diện đó sao?
newvới một giao diện trong một số tình huống nhất định.
Bạn có thể làm được việc này:
IEnumerable<object> list = new List<object>(){1, 4, 5}.AsEnumerable();
CallFunction(list);