วิธีการรวมรายการที่มีรายการประเภทเดียวกันเข้ากับรายการเดียว


209

คำถามสับสน แต่ชัดเจนกว่าที่อธิบายไว้ในรหัสต่อไปนี้:

   List<List<T>> listOfList;
   // add three lists of List<T> to listOfList, for example
   /* listOfList = new {
        { 1, 2, 3}, // list 1 of 1, 3, and 3
        { 4, 5, 6}, // list 2
        { 7, 8, 9}  // list 3
        };
   */
   List<T> list = null;
   // how to merger all the items in listOfList to list?
   // { 1, 2, 3, 4, 5, 6, 7, 8, 9 } // one list
   // list = ???

ไม่แน่ใจว่าเป็นไปได้หรือไม่โดยใช้ C # LINQ หรือ Lambda?

โดยพื้นฐานแล้วฉันจะเชื่อมต่อรายการ " แบน " เข้าด้วยกันได้อย่างไร

คำตอบ:


455

ใช้วิธีการส่วนขยาย SelectMany

list = listOfList.SelectMany(x => x).ToList();

73
ฉันสงสัยว่ามีกี่คนที่เขียนส่วนขยาย "แบน" ของตัวเองโดยไม่ทราบว่า SelectMany ทำงานอย่างไร
James Schek

1
ทำไม x => x จำเป็นสำหรับการทำงานนี้ ฉันมักจะเห็นสิ่งต่าง ๆ เช่น x => x +1 แต่ไม่ใช่ x => x
SwimBikeRun

9
@SwimBikeRun SelectMany ใช้ในการรับ IEnumerable ของ TSources แปลง TSource แต่ละรายการในรายการให้เป็น IEnumerable ของ TResults จากนั้นเชื่อม IEnumerable เหล่านั้นทั้งหมดให้เป็นหนึ่งใหญ่ ในกรณีนี้คุณมีรายการของรายการที่จะเริ่มดังนั้นถ้าคุณต้องการเชื่อมต่อพวกเขาฟังก์ชั่นเพื่อแมปจาก TSource (ซึ่งเป็น IEnumerable ของ TResults) กับ IEnumerable ของ TResults คือฟังก์ชั่นเอกลักษณ์ (x => x) นี่เป็นเพียงกรณีพิเศษที่คุณไม่ต้องการขั้นตอนพิเศษในการเปลี่ยนแต่ละ TSource ให้เป็นรายการเนื่องจากเป็นรายการอยู่แล้ว
ฌอน

@JaredPar เราสามารถใช้ตรรกะนี้เพื่อแสดงรายการ <list <list <T> >> ได้ไหม?
Tk1993

4
@TusharKukreti แน่นอนใช้เพียงlist.SelectMany(x => x.SelectMany(y => y)).ToList();
Brandon Kramer

13

นี่คือเวอร์ชันรวมของไวยากรณ์ C #:

var items =
    from list in listOfList
    from item in list
    select item;

สับสนเล็กน้อย แต่ก็ดี แล้วนี้ละ? รายการ var = จากรายการใน (จากรายการในรายการเลือกรายการรายการ) เลือกรายการ
David.Chu.ca

4
'double from' เหมือนกับ SelectMany ... SelectMany น่าจะเป็นวิธีที่ทรงพลังที่สุดของ LINQ (หรือตัวดำเนินการแบบสอบถาม) เพื่อดูว่าทำไม Google "LINQ SelectMany Monad" และคุณจะค้นพบมากกว่าที่คุณอยากรู้
Richard Anthony Hein

3
อย่าใส่เครื่องหมายคำพูดเมื่อ googling "LINQ SelectMany Monad" ไม่เช่นนั้นมันจะพาคุณกลับมาที่นี่
Oxin

12

คุณหมายถึงสิ่งนี้หรือไม่

var listOfList = new List<List<int>>() {
    new List<int>() { 1, 2 },
    new List<int>() { 3, 4 },
    new List<int>() { 5, 6 }
};
var list = new List<int> { 9, 9, 9 };
var result = list.Concat(listOfList.SelectMany(x => x));

foreach (var x in result) Console.WriteLine(x);

ผลลัพธ์ใน: 9 9 9 1 2 3 4 5 6


หรือคุณสามารถใช้ list.AddRange () แทน Concat () เพื่อเพิ่มไอเท็มที่ถูกผสานไปยังรายการที่มีอยู่
dahlbyk

1

สำหรับList<List<List<x>>>และอื่น ๆ การใช้งาน

list.SelectMany(x => x.SelectMany(y => y)).ToList();

สิ่งนี้ถูกโพสต์ในความคิดเห็น แต่มันสมควรได้รับคำตอบแยกต่างหากในความเห็นของฉัน

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