public class A {}
public class B : A {}
ตอนนี้วิธีที่ดีที่สุดในการทำงานนี้คืออะไร
List<A> a;
List<B> b = new List<B>();
a = b; // throw Cannot convert List<B> to List<A>
ขอบคุณ
public class A {}
public class B : A {}
ตอนนี้วิธีที่ดีที่สุดในการทำงานนี้คืออะไร
List<A> a;
List<B> b = new List<B>();
a = b; // throw Cannot convert List<B> to List<A>
ขอบคุณ
ประเภท List<T>
ไม่รองรับความแปรปรวนร่วม ดังนั้นคุณจึงไม่สามารถกำหนด List<B>
ให้กับ List<A>
โดยตรงได้ แม้ว่า B
จะสามารถกำหนดให้กับ A
ได้โดยตรงก็ตาม คุณจะต้องส่งผ่านรายการ b
โดยแปลงและเพิ่มรายการลงในรายการ a
ในขณะที่คุณดำเนินการ วิธีการ ConvertAll
เป็นวิธีที่สะดวกในการดำเนินการดังนี้:
List<B> b = new List<B>();
// ...
List<A> a = b.ConvertAll(x => (A)x);
ConvertAll
เป็นวิธีการอินสแตนซ์ในคลาส List<T>
และสร้าง List<T>
ใหม่จากรายการที่มีอยู่ Select
เป็นวิธีการขยายที่ทำงานกับ IEnumerable<T>
ใดๆ และสร้างลำดับ IEnumerable<T>
ใหม่ การใช้ ConvertAll
ควร เล็กน้อย เร็วกว่า Select
เนื่องจากสามารถเพิ่มประสิทธิภาพบางอย่างได้ (เช่น สามารถจัดสรรอาร์เรย์เป้าหมายให้มีความยาวที่ถูกต้องตั้งแต่เริ่มต้น แทนที่จะต้องปรับขนาดได้ทันที และ มันสามารถเข้าถึงอาร์เรย์พื้นฐานของรายการแหล่งที่มาได้โดยตรง แทนที่จะต้องสร้างอินสแตนซ์และใช้วัตถุตัวแจงนับแยกต่างหาก)
- person LukeH; 07.03.2011