เรียบรายการใน LINQ


313

ฉันมีการสืบค้น LINQ ที่ส่งกลับIEnumerable<List<int>>แต่ฉันต้องการกลับเท่านั้นList<int>ดังนั้นฉันต้องการรวมระเบียนของฉันทั้งหมดในของฉันIEnumerable<List<int>>ไปยังอาร์เรย์เดียวเท่านั้น

ตัวอย่าง:

IEnumerable<List<int>> iList = from number in
    (from no in Method() select no) select number;

ฉันต้องการที่จะนำผลลัพธ์ทั้งหมดของฉันIEnumerable<List<int>>ไปที่เดียวเท่านั้นList<int>

ดังนั้นจากแหล่งอาร์เรย์: [1,2,3,4] และ [5,6,7]

ฉันต้องการเพียงหนึ่งอาร์เรย์ [1,2,3,4,5,6,7]

ขอบคุณ

คำตอบ:


567

ลอง SelectMany()

var result = iList.SelectMany( i => i );

8
ขอบคุณฉันลืมสิ่งนี้เสมอ - ฉันรู้ว่ามันอยู่ที่นั่น แต่ฉันใช้เวลามากเกินไปกับ Googling ทุกครั้งที่ต้องการใช้ คั่นคำตอบนี้ :-)
BrainSlugs83

ในขณะที่ฉันกลัวว่าฉันเป็นคนเดียวที่เคยต้องการสิ่งนี้ ขอบคุณไมค์!
Arnab Chakraborty

7
มีไวยากรณ์อื่นให้SelectMany( i => i )หรือไม่ ฉันเคยเห็นซินแท็กซ์นี้ใช้บ่อย แต่ดูเหมือนว่าการใช้ฟีเจอร์ที่เลือกจะแย่ลงดังนั้นฉันคาดว่าผู้ออกแบบภาษาจะใช้ซินแท็กซ์ช็อตคัทเฉพาะสำหรับรายการที่ต้องการ
Andy

86

ด้วยไวยากรณ์แบบสอบถาม:

var values =
from inner in outer
from value in inner
select value;

ขอบคุณไวยากรณ์ที่ถูกต้องฉันกำลังมองหาและคำตอบจำนวนมากดังนั้นรายการอย่างอื่น verbose
SilverSideDown

นี่ดีกว่า SelectMany มาก ชัดเจนยิ่งขึ้นว่าเกิดอะไรขึ้นกับ IMO ขอบคุณที่ชี้ให้เห็น!
Bryan Rayner

3
โดยส่วนตัวฉันมักจะค้นหาเวอร์ชันไวยากรณ์ของคิวรีที่ใช้งานง่ายน้อยกว่ารุ่นที่เรียกเมธอด เมื่อ Resharper เสนอให้แปลงลูปเป็นนิพจน์ LINQ ถ้ามันทำให้ฉันมีไวยากรณ์ของคิวรีฉันมักจะเลิกทำ
bikeman868

23
iList.SelectMany(x => x).ToArray()

6
@recursive ทุกคนคิดถึงอะไรอีก? .ToArray()? - มันเป็นสถานการณ์ที่หากคุณต้องการวนซ้ำเพียงครั้งเดียว - หรือหากรายการมีแนวโน้มที่จะเปลี่ยนแปลง.ToArray()นั่นก็ไม่ใช่สิ่งที่คุณต้องการแน่นอน แต่ด้วยสแตติกไอเท็มที่คุณจะระบุหลาย ๆ ครั้ง.ToList()หรือ.ToArray()จะปรับปรุงประสิทธิภาพ (ในราคาของการใช้หน่วยความจำที่สูงขึ้นเล็กน้อยซึ่งมักจะเป็นข้อตกลงที่ดีทีเดียว)
BrainSlugs83

2
สันนิษฐานว่าสถานการณ์ในกรณีนี้ต้องมีอาร์เรย์เนื่องจากมีการระบุไว้ในคำถาม
เรียกซ้ำ

8
@ recursive หากเราเป็น nitpicking ผู้ปฏิบัติการบอกว่าเขาต้องการกลับมาList<int>ดังนั้น.ToList()จะเป็นทางเลือกที่ถูกต้อง
MEMark

@Markark OP ระบุว่า "มีเพียงอาร์เรย์เดียว"
StefanJanssen


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