Cara favorit untuk membuat urutan IEnumerable <T> baru dari satu nilai?

97

Saya biasanya membuat urutan dari satu nilai menggunakan sintaks array, seperti ini:

IEnumerable<string> sequence = new string[] { "abc" };

Atau menggunakan Daftar baru. Saya ingin mendengar apakah ada yang memiliki cara yang lebih ekspresif untuk melakukan hal yang sama.

Marcel Lamothe
sumber
3
Bagaimana urutan kosong itu?
CoderDennis
Sangat memalukan bahwa dotnet masih belum memiliki sesuatu seperti itu Enumerable.From<T>(params T[] items).
Good Night Nerd Pride

Jawaban:

144

Contoh Anda bukanlah urutan kosong, ini adalah urutan dengan satu elemen. Untuk membuat urutan string kosong bisa Anda lakukan

var sequence = Enumerable.Empty<string>();

EDIT OP mengklarifikasi bahwa mereka ingin membuat nilai tunggal. Dalam hal itu

var sequence = Enumerable.Repeat("abc",1);
JaredPar
sumber
D'oh, aku teralihkan, maaf. Maksud saya membuat dari satu nilai, bukan membuat contoh kosong!
Marcel Lamothe
Ini adalah bendera 'jawaban' itu?
n8wrl
Metode ini lebih murni berfungsi daripada membuat array baru.
Roy Tinker
69

Saya suka apa yang Anda sarankan, tetapi dengan tipe array dihilangkan:

var sequence = new[] { "abc" };
Bryan Watts
sumber
4
Saya tidak pernah menyadari bahwa Anda bisa melakukan itu. Saya pikir ini lebih jelas daripada menggunakan Ulangi.
Marcel Lamothe
1
Tapi ini bukan IEnumerable, ini sebuah array!
Zodman
4
@ Bryan Watts Saya tahu itu, tapi ini adalah implementasi konkret dari IEnumerable. Pertanyaannya adalah meminta IEnumerable <> (meskipun contohnya tidak). Ada perbedaan.
Zodman
Mungkin pertanyaannya harus diubah.
Zodman
1
@Jonesopolis: Itu adalah situasi yang berbeda dan tidak berhubungan. Anda dapat menggunakan Task.FromResultuntuk mencapai itu.
Bryan Watts
21

Atau bahkan lebih pendek,

string[] single = { "abc" };

Saya akan membuat metode ekstensi:

public static T[] Yield<T>(this T item)
{
    T[] single = { item };
    return single;
}

Atau bahkan lebih baik dan lebih pendek, adil

public static IEnumerable<T> Yield<T>(this T item)
{
    yield return item;
}

Mungkin inilah yang sebenarnya Enumerable.Repeatdilakukan di bawah tenda.

nawfal
sumber
1
Yang terakhir itu brilian. Kecuali untuk nama ... ini akan berkonflik dengan tipe yang sudah mengimplementasikan IEnumerable seperti string dalam contoh Anda. Coba .AsSingleItemEnumerable (), atau cukup .Yield () -> "abc" .Yield ()
DanO
7
Menurut saya ToEnumerable lebih tepat.
Zodman
2
+1 Yieldbagus. Saya membuat IEnumerable<T> Yield<T>(this T source, params T[] others)juga.
Jodrell
Saya mencoba untuk menyingkirkan Yield sama sekali demi lambda tetapi entah bagaimana itu tidak pernah dikompilasi ... cf. stackoverflow.com/questions/1217729/… ;-).
Peter - Kembalikan Monica
@PeterSchneider bagaimana dan mengapa Anda melakukan itu? Tanpa melihat kode saya tidak bisa berkomentar. Saya tidak berpikir saya mengikuti Anda.
nawfal
5

atau buat saja metode

public static IEnumerable<T> CreateEnumerable<T>(params T[] items)
{
    if(items == null)
        yield break;

    foreach (T mitem in items)
        yield return mitem;
}

atau

public static IEnumerable<T> CreateEnumerable<T>(params T[] items)
{
   return items ?? Enumerable.Empty<T>();
}

penggunaan:

IEnumerable<string> items = CreateEnumerable("single");
Andrew
sumber