ฉันต้องการสร้างอินสแตนซ์ใหม่ของวัตถุ IEnumerable<object>
ฉันสามารถทำสิ่งนี้ได้หรือไม่?
IEnumerable<object> a = new IEnumerable<object>();
ฉันต้องการสร้างอินสแตนซ์ใหม่ของวัตถุ IEnumerable<object>
ฉันสามารถทำสิ่งนี้ได้หรือไม่?
IEnumerable<object> a = new IEnumerable<object>();
IEnumerable<T>ได้ List<T>คุณต้องใช้สิ่งที่ต้องการ
IEnumerable<T>ไม่ได้เป็นตัวแทนของ iterator - มันแสดงให้เห็นถึงiterableลำดับ IEnumerator<T>ตัวเองแสดงถึงตัววนซ้ำ
คำตอบ:
เช่นคุณสามารถสร้างตัวอย่างของซึ่งการดำเนินการList<object> IEnumerable<object>ตัวอย่าง:
List<object> list = new List<object>();
list.Add(1);
list.Add(4);
list.Add(5);
IEnumerable<object> en = list;
CallFunction(en);
IEnumerable<T>เป็นแนวคิดที่ไม่ดี IMO
เนื่องจากคุณระบุแล้วว่าต้องการเพิ่มสิ่งที่คุณต้องการไม่ใช่เรื่องง่ายIEnumerable<T>แต่อย่างน้อยก็คือICollection<T>. ฉันขอแนะนำให้ใช้สิ่งList<T>นี้:
List<object> myList=new List<object>();
myList.Add(1);
myList.Add(2);
myList.Add(3);
คุณสามารถใช้ myList ทุกIEnumerable<object>คาดว่าเนื่องจากการดำเนินการList<object>IEnumerable<object>
(คำตอบเก่าก่อนการชี้แจง)
คุณไม่สามารถสร้างอินสแตนซ์ได้IEnumerable<T>เนื่องจากเป็นอินเทอร์เฟซปกติ (บางครั้งอาจระบุการใช้งานเริ่มต้นได้ แต่โดยปกติจะใช้กับ COM เท่านั้น)
ดังนั้นสิ่งที่คุณต้องการจริงๆคือยกตัวอย่างคลาสที่ใช้อินเตอร์เฟซ IEnumerable<T>พฤติกรรมแตกต่างกันไปขึ้นอยู่กับคลาสที่คุณเลือก
สำหรับลำดับว่างให้ใช้:
IEnumerable<object> e0=Enumerable.Empty<object>();
IEnumerable<T>สำหรับนับว่างเปล่าไม่ใช่คุณสามารถใช้คอลเลกชันบางอย่างที่นำไปปฏิบัติ ทางเลือกส่วนใหญ่จะเป็นอาร์เรย์T[], หรือถ้าคุณต้องการเปลี่ยนไม่ได้List<T>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});
อีกวิธีหนึ่งในการใช้งานIEnumerable<T>คือคุณลักษณะตัววนซ้ำที่นำมาใช้ใน C # 3
IEnumerable<object> MyIterator()
{
yield return 1;
yield return 2;
yield return 3;
}
IEnumerable<object> e4=MyIterator();
Emptyทางออกก็จะใช้
IEnumerable<object> a = Enumerable.Empty<object>();
มีเธรดเกี่ยวกับ SO เกี่ยวกับเรื่องนี้: จะดีกว่าไหมถ้าใช้ Enumerable.Empty () เมื่อเทียบกับรายการใหม่เพื่อเริ่มต้น IEnumerable?
ไม่คุณทำไม่ได้เนื่องจากIEnumerableเป็นอินเทอร์เฟซ
คุณควรจะสามารถสร้างอินสแตนซ์ว่างของประเภทที่ไม่ใช่อินเทอร์เฟซส่วนใหญ่ที่ใช้งานIEnumerableได้เช่น: -
IEnumerable<object> a = new object[] { };
หรือ
IEnumerable<object> a = new List<object>();
ไม่คุณไม่สามารถทำได้ ใช้โค้ดบรรทัดต่อไปนี้แทน:
IEnumerable<int> usersIds = new List<int>() {1, 2, 3}.AsEnumerable();
ฉันหวังว่ามันจะช่วยได้
ฉันต้องการสร้างวัตถุหรือรายการที่แจกแจงได้ใหม่และสามารถเพิ่มเข้าไปได้
ความคิดเห็นนี้เปลี่ยนแปลงทุกอย่าง คุณไม่สามารถเพิ่มลงในแบบทั่วไปIEnumerable<T>ได้ หากคุณต้องการอยู่กับอินเทอร์เฟซSystem.Collections.Genericคุณต้องใช้คลาสที่ใช้ICollection<T>เช่นList<T>.
เหตุผลหลักคือการที่เราไม่สามารถสร้างวัตถุของอินเตอร์เฟซและ IEnumerable เป็นอินเตอร์เฟซ เราจำเป็นต้องสร้างวัตถุของคลาสที่ใช้อินเทอร์เฟซ นี่คือเหตุผลหลักที่เราไม่สามารถสร้าง object ของ IEnumerable ได้โดยตรง
ไม่มี IEnumerable เป็นอินเทอร์เฟซคุณไม่สามารถสร้างอินเทอร์เฟซได้
คุณสามารถทำสิ่งนี้ได้
IEnumerable<object> a = new object[0];
new SomeComInterface()อินสแตนซ์ "CoClass" ที่เกี่ยวข้องกับอินเทอร์เฟซแทนที่จะเป็นอินสแตนซ์อินเทอร์เฟซเอง
newกับอินเทอร์เฟซในบางสถานการณ์ได้
คุณสามารถทำได้:
IEnumerable<object> list = new List<object>(){1, 4, 5}.AsEnumerable();
CallFunction(list);