วิธีการต่อเชื่อม IENumerable <T> สองอันเข้ากับ IEnumerable <T> ใหม่ได้อย่างไร


201

ฉันมีสองอินสแตนซ์ของIEnumerable<T>(พร้อมกันT) ฉันต้องการอินสแตนซ์ใหม่IEnumerable<T>ซึ่งเป็นการเชื่อมต่อของทั้งสอง

มีวิธีการ build-in ใน. Net เพื่อทำสิ่งนั้นหรือฉันต้องเขียนเอง?


9
คุณอาจต้องการที่คั่นcode.msdn.microsoft.com/101-LINQ-Samples-3fb9811b
C-Pound Guru

คำตอบ:


333

ใช่ LINQ to Objects รองรับสิ่งนี้ด้วยEnumerable.Concat:

var together = first.Concat(second);

หมายเหตุ: ควรfirstหรือเป็นโมฆะคุณจะได้รับsecond ArgumentNullExceptionหากต้องการหลีกเลี่ยงปัญหานี้และจัดการค่า null ตามที่คุณต้องการให้ใช้ชุดตัวดำเนินการว่างรวมเช่น

var together = (first ?? Enumerable.Empty<string>()).Concat(second ?? Enumerable.Empty<string>()); //amending `<string>` to the appropriate type

1
ฉันลืมค้นหาวิธีการขยายเสมอ
Samuel Rossille

10
@SamuelRossille อย่าลืมว่าชื่อของแอ็คชั่นที่คุณต้องการเล่นนั้นอาจจะใกล้เคียงกันหากไม่ได้เรียกสิ่งที่คุณต้องการ เรียกดู IntelliSense ทุกครั้งที่คุณเรียนรู้มากมาย
Adam Houldsworth

3
การทำอันดับที่สองเป็นอันดับแรกนั้นแย่ไหม เราจะมีปัญหาการทำงานพร้อมกันไหม?
user2934433

4
@ user2934433: ไม่ก็ไม่เป็นไร
Jon Skeet

2
เพียงแค่บันทึกย่อ จำเป็นต้องนำเข้าusing System.Linq เนมสเปซที่ด้านบนของไฟล์รหัสเพื่อดูวิธีการขยายที่ต้องการใน IntelliSense
RBT

19

Concatวิธีการจะกลับวัตถุซึ่งดำเนินการIEnumerable<T>โดยการกลับวัตถุ (เรียกว่าแมว) ที่มีการแจงนับจะพยายามที่จะใช้สองผ่านในรายการนับ (เรียกพวกเขา A และ B) ตามลำดับ หากการนับจำนวนผ่านแสดงถึงลำดับซึ่งจะไม่เปลี่ยนแปลงระหว่างอายุการใช้งานของ Cat และสามารถอ่านได้โดยไม่มีผลข้างเคียงดังนั้น Cat อาจถูกใช้โดยตรง มิฉะนั้นมันอาจจะเป็นความคิดที่ดีที่จะเรียกToList()ในCatและใช้ที่เกิดขึ้นList<T>(ซึ่งจะเป็นตัวแทนของภาพรวมของเนื้อหาของ A และ B ที่)

การแจกแจงบางอย่างใช้สแน็ปช็อตเมื่อการแจงนับเริ่มต้นและจะส่งคืนข้อมูลจากสแน็ปช็อตนั้นหากคอลเลกชันถูกแก้ไขระหว่างการแจงนับ หาก B เป็นจำนวนที่นับได้การเปลี่ยนแปลงใด ๆ ที่เกิดขึ้นก่อนที่แมวจะมาถึงจุดสิ้นสุดของ A จะปรากฏในการแจงนับของ Cat แต่การเปลี่ยนแปลงที่เกิดขึ้นหลังจากนั้นจะไม่เกิดขึ้น ความหมายเช่นนั้นอาจทำให้เกิดความสับสน การถ่ายภาพรวมของ Cat สามารถหลีกเลี่ยงปัญหาดังกล่าว


7

คุณสามารถใช้รหัสด้านล่างสำหรับการแก้ปัญหาของคุณ: -

public void Linq94() 
{ 
    int[] numbersA = { 0, 2, 4, 5, 6, 8, 9 }; 
    int[] numbersB = { 1, 3, 5, 7, 8 }; 

    var allNumbers = numbersA.Concat(numbersB); 

    Console.WriteLine("All numbers from both arrays:"); 
    foreach (var n in allNumbers) 
    { 
        Console.WriteLine(n); 
    } 
}

0
// The answer that I was looking for when searching
public void Answer()
{
    IEnumerable<YourClass> first = this.GetFirstIEnumerableList();
    // Assign to empty list so we can use later
    IEnumerable<YourClass> second = new List<YourClass>();

    if (IwantToUseSecondList)
    {
        second = this.GetSecondIEnumerableList();  
    }
    IEnumerable<SchemapassgruppData> concatedList = first.Concat(second);
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.