List.AddRange()
มีอยู่ แต่IList.AddRange()
ไม่มี
สิ่งนี้ทำให้ฉันประหลาดใจ เหตุผลเบื้องหลังนี้คืออะไร?
List.AddRange()
มีอยู่ แต่IList.AddRange()
ไม่มี
สิ่งนี้ทำให้ฉันประหลาดใจ เหตุผลเบื้องหลังนี้คืออะไร?
คำตอบ:
เนื่องจากอินเทอร์เฟซ shoud ใช้งานง่ายและไม่มี "ทุกอย่างยกเว้นห้องครัว" หากคุณเพิ่มAddRange
คุณควรเพิ่มInsertRange
และRemoveRange
(สำหรับสมมาตร) คำถามที่ดีกว่าคือทำไมไม่มีวิธีการขยายสำหรับIList<T>
อินเทอร์เฟซที่คล้ายกับIEnumerable<T>
อินเทอร์เฟซ (วิธีการขยายสำหรับในสถานที่Sort
, BinarySearch
... จะเป็นประโยชน์)
IFoo
) การประกาศเพื่อระบุเนมสเปซ "ตัวช่วย" (เช่นMyAssembly
) เช่นหากคลาสอ้างว่าใช้งานIFoo
แต่ไม่มีเมธอดint Bar(String)
คอมไพเลอร์จะอัตโนมัติ สร้างวิธีการint IFoo.Bar(String p1) {return MyAssembly.ClassHelpers.IFoo.Bar(this, p1);}
หากมีคุณลักษณะดังกล่าวอินเทอร์เฟซอาจมีวิธีการอื่น ๆAddRange
ที่สามารถนำไปใช้ในแง่ของพฤติกรรมพื้นฐานได้ แต่การใช้งานบางอย่างสามารถปรับให้เหมาะสมได้
สำหรับผู้ที่ต้องการมีวิธีการขยายสำหรับ "AddRange", "Sort", ... บน IList,
ด้านล่างนี้เป็นAddRange
วิธีการขยาย:
public static void AddRange<T>(this IList<T> source, IEnumerable<T> newList)
{
if (source == null)
{
throw new ArgumentNullException(nameof(source));
}
if (newList == null)
{
throw new ArgumentNullException(nameof(newList));
}
if (source is List<T> concreteList)
{
concreteList.AddRange(newList);
return;
}
foreach (var element in newList)
{
source.Add(element);
}
}
ฉันสร้างห้องสมุดขนาดเล็กที่ทำสิ่งนี้ ฉันพบว่ามันใช้งานได้จริงมากกว่าที่จะต้องทำวิธีการขยายซ้ำในแต่ละโครงการ
วิธีการบางอย่างช้ากว่า List แต่ได้ผล
นี่คือ GitHub ที่น่าสนใจ:
AddRange/RemoveRange/InsertRange
สามารถทำงานได้โดยตรงในคอลเลกชัน "ภายใน" และเพิ่มประสิทธิภาพการCapacity
จัดการและใช้วิธีการต่างๆเช่นArray.Copy
ย้ายไปรอบ ๆ บล็อกข้อมูล วิธีการขยายRemoveRange
อาจเป็นลำดับการขยายที่ช้ากว่าList.RemoveRange