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.