มีวิธีการทั่วไปในการส่งรายการประเภทเดียวT
ไปยังวิธีที่คาดว่า IEnumerable<T>
พารามิเตอร์หรือไม่ ภาษาคือ C #, กรอบงานเวอร์ชัน 2.0
ขณะนี้ฉันกำลังใช้วิธีผู้ช่วย (เป็น. Net 2.0 ดังนั้นฉันจึงมีวิธีการคัดเลือก / ฉายผู้ช่วยที่คล้ายกับ LINQ ทั้งหมด) แต่วิธีนี้ดูเหมือนโง่:
public static class IEnumerableExt
{
// usage: IEnumerableExt.FromSingleItem(someObject);
public static IEnumerable<T> FromSingleItem<T>(T item)
{
yield return item;
}
}
วิธีการอื่น ๆ ของหลักสูตรจะมีการสร้างและเติมList<T>
หรือและผ่านมันแทนArray
IEnumerable<T>
[แก้ไข]เป็นวิธีการขยายอาจตั้งชื่อ:
public static class IEnumerableExt
{
// usage: someObject.SingleItemAsEnumerable();
public static IEnumerable<T> SingleItemAsEnumerable<T>(this T item)
{
yield return item;
}
}
ฉันทำอะไรบางอย่างหายไปหรือเปล่า
[แก้ไข 2]เราพบsomeObject.Yield()
(ตามที่ @Peter แนะนำในความคิดเห็นด้านล่าง) เป็นชื่อที่ดีที่สุดสำหรับวิธีการขยายนี้ส่วนใหญ่เป็นเรื่องสั้นดังนั้นที่นี่มันพร้อมกับความคิดเห็น XML หากใครต้องการคว้ามัน:
public static class IEnumerableExt
{
/// <summary>
/// Wraps this object instance into an IEnumerable<T>
/// consisting of a single item.
/// </summary>
/// <typeparam name="T"> Type of the object. </typeparam>
/// <param name="item"> The instance that will be wrapped. </param>
/// <returns> An IEnumerable<T> consisting of a single item. </returns>
public static IEnumerable<T> Yield<T>(this T item)
{
yield return item;
}
}
AsEnumerable
เพราะในตัวส่วนขยายที่มีชื่อที่มีอยู่แล้ว (เมื่อT
ดำเนินการIEnumerable
เช่น, string
.)
Yield
? ไม่มีอะไรจะเต้นเร็ว
left==null
ตรวจสอบที่นี่ มันแบ่งความสวยงามของรหัสและหยุดรหัสที่ยืดหยุ่นได้มากขึ้น - ถ้าวันใดคุณเปิดออกจำเป็นต้องสร้างซิงเกิลตันด้วยสิ่งที่สามารถเป็นโมฆะได้? ฉันหมายความว่าnew T[] { null }
ไม่เหมือนกันnew T[] {}
และบางวันคุณอาจจำเป็นต้องแยกแยะพวกเขา
if (item == null) yield break;
ตอนนี้คุณกำลังหยุดผ่าน null เช่นเดียวกับการใช้ประโยชน์จาก (เล็กน้อย) รูปแบบวัตถุ nullIEnumerable
สำหรับ (foreach (var x in xs)
จัดการกับความว่างเปล่าได้xs
ดี) บังเอิญฟังก์ชั่นนี้เป็นหน่วย monadic สำหรับรายการ monad ที่เป็นIEnumerable<T>
และได้รับ monad love-fest ที่ Microsoft ฉันประหลาดใจบางอย่างเช่นนี้ไม่ได้อยู่ในกรอบในสถานที่แรก