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.


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);

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" };

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.


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");
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.