แปลงจาก List เป็นรูปแบบ IEnumerable


99
IEnumerable<Book> _Book_IE
List<Book> _Book_List

ฉันจะแปลง_Book_Listเป็นIEnumerableรูปแบบได้อย่างไร


6
อย่างน้อยเขาก็มีระเบียบแบบแผนใช่มั้ย?
Femaref

1
สำหรับคนที่สงสัยว่าทำไมความคิดเห็นของเคิร์กถึงมี "อัพ" มากมายนั่นเป็นเพราะคุณไม่สามารถตั้งชื่อตัวแปรในแบบที่คุณต้องการได้! มีข้อตกลงในเรื่องนี้และขอแนะนำให้คุณปฏิบัติตามเพื่อให้โค้ดของคุณชัดเจนและเข้าใจได้ซึ่งจะช่วยให้ผู้คนพยายามช่วยเหลือคุณในสถานที่ต่างๆเช่น Stack-overflow หรือ GitHub! สำหรับข้อมูลเพิ่มเติมโปรดอ่านหนังสือ: Clean Codeโดย Robert C. Martin
KADEM Mohammed

1
... และจะทำอย่างไรกับหลักการตั้งชื่อโดยไม่ตกเป็นเหยื่อของรูปแบบต่อต้านการตั้งชื่อ Smurf? devcards.io/smurf-naming-conventionโดยทั่วไปแล้วเนมสเปซสามารถให้ความเฉพาะเจาะจงได้เมื่อจำเป็น
Meadock

Convertint เป็น ienumerable มีประโยชน์เป็นพิเศษเมื่อคุณต้องการใช้. Reverse () ในนิพจน์ Linq
Zuabros

คำตอบ:


152

คุณไม่จำเป็นต้องแปลง List<T>ใช้IEnumerable<T>อินเทอร์เฟซเพื่อให้สามารถระบุได้อยู่แล้ว

ซึ่งหมายความว่าการมีสิ่งต่อไปนี้เป็นสิ่งที่ดีอย่างยิ่ง

public IEnumerable<Book> GetBooks()
{
    List<Book> books = FetchEmFromSomewhere();    
    return books;
}

เช่นเดียวกับ:

public void ProcessBooks(IEnumerable<Book> books)
{
    // do something with those books
}

ซึ่งสามารถเรียกได้:

List<Book> books = FetchEmFromSomewhere();    
ProcessBooks(books);

66

คุณสามารถใช้วิธีการขยาย AsEnumerable ใน Assembly System.Core และ System.Linq namespace:

List<Book> list = new List<Book>();
return list.AsEnumerable();

ตามที่กล่าวไว้ในลิงก์ MSDN นี้จะเปลี่ยนประเภทของรายการในเวลาคอมไพล์ สิ่งนี้จะให้ประโยชน์แก่คุณในการระบุเฉพาะคอลเลคชันของคุณที่เราต้องการเท่านั้น (ดูตัวอย่าง MSDN สำหรับสิ่งนี้)


ดูเรียบง่าย แต่เป็นวิธีที่ง่ายที่สุดในการแปลง ขอบคุณ
Ishwor Khanal

1
หากคุณไม่คิดว่าจะเพิ่มบางอย่างลงในคอลเล็กชันคุณควรใช้ / ส่งคืน IEnumerable
AZ_


11

เท่าที่ผมรู้ว่าการดำเนินการList<T> IEnumerable<T>หมายความว่าคุณไม่ต้องแปลงหรือหล่ออะไรเลย


4
มันขึ้นอยู่กับ. หากคุณพยายามตั้งค่า a IEnumerable<IList<obj>>เป็นIEnumerable<IEnumerable<obj>>จะทำให้เกิดข้อผิดพลาดของคอมไพเลอร์เนื่องจากตัวที่สองไม่ได้รับมรดกจากตัวแรก
Emaborsa

4
IEnumerable<Book> _Book_IE;
List<Book> _Book_List;

หากเป็นตัวแปรทั่วไป:

_Book_IE = _Book_List;

หากคุณต้องการแปลงเป็นแบบที่ไม่ใช่ทั่วไป:

IEnumerable ie = (IEnumerable)_Book_List;

5
คุณไม่ต้องการนักแสดงที่นี่
Jon Skeet

2
คุณจะทำอย่างไรหากคุณต้องการวิธีการเฉพาะจากอินเทอร์เฟซที่ไม่ใช่แบบทั่วไปเนื่องจากบางส่วนมีการนำไปใช้อย่างชัดเจนหรือฉันกำลังดำเนินการผิดที่นี่?
Femaref

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.