ประเภทIEnumerable<T>
ไม่รองรับการทำงานดังกล่าว วัตถุประสงค์ของIEnumerable<T>
อินเทอร์เฟซคือเพื่อให้ผู้บริโภคสามารถดูเนื้อหาของคอลเลกชัน ที่จะไม่แก้ไขค่า
เมื่อคุณดำเนินการเช่น. ToList (). Add () คุณกำลังสร้างใหม่List<T>
และเพิ่มมูลค่าให้กับรายการนั้น ไม่มีการเชื่อมต่อกับรายการเดิม
สิ่งที่คุณสามารถทำได้คือใช้วิธีการเพิ่มส่วนขยายเพื่อสร้างใหม่IEnumerable<T>
ด้วยมูลค่าเพิ่ม
items = items.Add("msg2");
แม้ในกรณีนี้มันจะไม่แก้ไขIEnumerable<T>
วัตถุต้นฉบับ สิ่งนี้สามารถตรวจสอบได้โดยถือการอ้างอิงถึงมัน ตัวอย่างเช่น
var items = new string[]{"foo"};
var temp = items;
items = items.Add("bar");
หลังจากชุดของการดำเนินการนี้ตัวแปรชั่วคราวจะยังคงอ้างอิงเฉพาะการนับด้วยองค์ประกอบ "foo" เดียวในชุดของค่าในขณะที่รายการจะอ้างอิงแตกต่างกันนับด้วยค่า "foo" และ "บาร์"
แก้ไข
ฉันลืมอย่างแน่นอนว่าการเพิ่มไม่ใช่วิธีการต่อเติมแบบทั่วไปIEnumerable<T>
เพราะเป็นหนึ่งในวิธีแรกที่ฉันกำหนด นี่ไง
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>
มีวัตถุประสงค์เพื่อสอบถามคอลเลกชันเท่านั้น มันเป็นกระดูกสันหลังสำหรับกรอบ LINQ มันก็มักจะเป็นนามธรรมของคอลเลกชันอื่น ๆ บางอย่างเช่นCollection<T>
, หรือList<T>
Array
อินเทอร์เฟซให้GetEnumerator
วิธีการที่ส่งคืนอินสแตนซ์IEnumerator<T>
ที่เปิดใช้งานการเดินการขยายคอลเลกชันทีละรายการเท่านั้น เมธอดส่วนขยาย LINQ ถูก จำกัด โดยอินเตอร์เฟสนี้IEnumerable<T>
ถูกออกแบบมาเพื่อให้อ่านได้เพียงเพราะมันอาจเป็นตัวแทนของการรวมส่วนของคอลเลกชันหลาย ๆ