Apakah ada cara umum untuk mengirimkan satu item bertipe T
ke metode yang mengharapkan IEnumerable<T>
parameter? Bahasa adalah C #, framework versi 2.0.
Saat ini saya menggunakan metode helper (ini. Net 2.0, jadi saya memiliki sejumlah metode casting / projecting helper yang mirip dengan LINQ), tetapi ini sepertinya konyol:
public static class IEnumerableExt
{
// usage: IEnumerableExt.FromSingleItem(someObject);
public static IEnumerable<T> FromSingleItem<T>(T item)
{
yield return item;
}
}
Cara lain tentu saja adalah dengan membuat dan mengisi a List<T>
atau a Array
dan meneruskannya daripada IEnumerable<T>
.
[Sunting] Sebagai metode ekstensi itu mungkin dinamai:
public static class IEnumerableExt
{
// usage: someObject.SingleItemAsEnumerable();
public static IEnumerable<T> SingleItemAsEnumerable<T>(this T item)
{
yield return item;
}
}
Apakah saya melewatkan sesuatu di sini?
[Sunting2] Kami menemukan someObject.Yield()
(seperti yang disarankan @Peter dalam komentar di bawah) sebagai nama terbaik untuk metode ekstensi ini, terutama untuk singkatnya, jadi di sini beserta komentar XML jika ada yang ingin mengambilnya:
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;
}
}
Yield
? Tidak ada yang mengalahkan singkatnya.
left==null
cek di sini. Itu merusak keindahan kode dan menghentikan kode menjadi lebih fleksibel - bagaimana jika suatu hari nanti Anda perlu menghasilkan singleton dengan sesuatu yang bisa nol? Maksud saya, new T[] { null }
tidak sama dengan new T[] {}
, dan suatu hari Anda mungkin perlu membedakan mereka.
if (item == null) yield break;
Sekarang Anda berhenti dari melewati nol serta mengambil keuntungan dari pola objek nol (sepele) untukIEnumerable
. (foreach (var x in xs)
menangani kosongxs
saja). Kebetulan, fungsi ini adalah unit monadik untuk daftar monad ituIEnumerable<T>
, dan mengingat cinta-fest monad di Microsoft saya terkejut sesuatu seperti ini tidak dalam kerangka di tempat pertama.