ฉันมีสองอินสแตนซ์ของIEnumerable<T>
(พร้อมกันT
) ฉันต้องการอินสแตนซ์ใหม่IEnumerable<T>
ซึ่งเป็นการเชื่อมต่อของทั้งสอง
มีวิธีการ build-in ใน. Net เพื่อทำสิ่งนั้นหรือฉันต้องเขียนเอง?
ฉันมีสองอินสแตนซ์ของIEnumerable<T>
(พร้อมกันT
) ฉันต้องการอินสแตนซ์ใหม่IEnumerable<T>
ซึ่งเป็นการเชื่อมต่อของทั้งสอง
มีวิธีการ build-in ใน. Net เพื่อทำสิ่งนั้นหรือฉันต้องเขียนเอง?
คำตอบ:
ใช่ 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
using System.Linq
เนมสเปซที่ด้านบนของไฟล์รหัสเพื่อดูวิธีการขยายที่ต้องการใน IntelliSense
Concat
วิธีการจะกลับวัตถุซึ่งดำเนินการIEnumerable<T>
โดยการกลับวัตถุ (เรียกว่าแมว) ที่มีการแจงนับจะพยายามที่จะใช้สองผ่านในรายการนับ (เรียกพวกเขา A และ B) ตามลำดับ หากการนับจำนวนผ่านแสดงถึงลำดับซึ่งจะไม่เปลี่ยนแปลงระหว่างอายุการใช้งานของ Cat และสามารถอ่านได้โดยไม่มีผลข้างเคียงดังนั้น Cat อาจถูกใช้โดยตรง มิฉะนั้นมันอาจจะเป็นความคิดที่ดีที่จะเรียกToList()
ในCat
และใช้ที่เกิดขึ้นList<T>
(ซึ่งจะเป็นตัวแทนของภาพรวมของเนื้อหาของ A และ B ที่)
การแจกแจงบางอย่างใช้สแน็ปช็อตเมื่อการแจงนับเริ่มต้นและจะส่งคืนข้อมูลจากสแน็ปช็อตนั้นหากคอลเลกชันถูกแก้ไขระหว่างการแจงนับ หาก B เป็นจำนวนที่นับได้การเปลี่ยนแปลงใด ๆ ที่เกิดขึ้นก่อนที่แมวจะมาถึงจุดสิ้นสุดของ A จะปรากฏในการแจงนับของ Cat แต่การเปลี่ยนแปลงที่เกิดขึ้นหลังจากนั้นจะไม่เกิดขึ้น ความหมายเช่นนั้นอาจทำให้เกิดความสับสน การถ่ายภาพรวมของ Cat สามารถหลีกเลี่ยงปัญหาดังกล่าว
คุณสามารถใช้รหัสด้านล่างสำหรับการแก้ปัญหาของคุณ: -
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);
}
}
// 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);
}