Tek bir değerden yeni bir IEnumerable <T> dizisi oluşturmanın favori yolu nedir?


98

Genellikle aşağıdaki gibi dizi sözdizimini kullanarak tek bir değerden bir dizi oluştururum:

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

Veya yeni bir Liste kullanarak. Birinin aynı şeyi yapmanın daha anlamlı bir yolu olup olmadığını duymak isterim.


3
Bu nasıl boş bir sekans olur?
— CoderDennis

Dotnet'in hala benzer bir şeye sahip olmaması utanç verici Enumerable.From<T>(params T[] items).
— Good Night Nerd Pride

Yanıtlar:


145

Örneğiniz boş bir dizi değil, tek elemanlı bir dizi. Boş bir dizi oluşturmak için şunları yapabilirsiniz:

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

EDIT OP, tek bir değer yaratmak istediklerini açıkladı. Bu durumda

var sequence = Enumerable.Repeat("abc",1);

D'oh, dikkatim dağıldı, üzgünüm. Tek bir değerden yaratmak demek istedim, boş bir örnek oluşturmak değil!
— Marcel Lamothe

Bu 'cevap' işaretleyin mi?
— n8wrl

Bu yöntem, yeni bir dizi oluşturmaktan daha tamamen işlevseldir.
— Roy Tinker

69

Önerdiğiniz şeyi beğendim, ancak dizi türü atlanmış:

var sequence = new[] { "abc" };

4
Bunu yapabileceğini hiç fark etmemiştim. Bunun Tekrar kullanmaktan daha açık olduğunu düşünüyorum.
— Marcel Lamothe

1
Ama bu bir IEnumerable değil, bir dizi!
— Zodman

4
@Bryan Watts Bunu biliyorum, ancak bu bir IEnumerable'ın somut bir uygulaması. Soru bir IEnumerable <> istiyor (örnek olmasa bile). Bir fark var.
— Zodman

Belki soru değiştirilmeli.
— Zodman

1
@Jonesopolis: Bu farklı, ilgisiz bir durum. Bunu Task.FromResultbaşarmak için kullanabilirsiniz .
— Bryan Watts

22

Ya da daha kısa

string[] single = { "abc" };

Bir uzatma yöntemi yapardım:

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

Ya da daha iyi ve daha kısa, sadece

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

Belki de Enumerable.Repeatkaputun altında yapılan tam olarak budur .


1
Sonuncusu harika. Adı dışında ... örneğinizdeki dize gibi zaten IEnumerable uygulayan türlerle çakışacaktır. Deneyin .AsSingleItemEnumerable () veya basitçe .Yield () -> "abc" .Yield ()
— DanO

8
ToEnumerable'ın daha uygun olduğunu düşünüyorum.
— Zodman

2
+1 Yieldiyidir. Ben de yaptım IEnumerable<T> Yield<T>(this T source, params T[] others).
— Jodrell

Yield'i tamamen bir lambda lehine kaldırmaya çalıştım ama bir şekilde asla derlenmedi ... cf. stackoverflow.com/questions/1217729/… ;-).
— Peter - Monica'yı Yeniden

@PeterSchneider bunu nasıl ve neden yaptın? Kodu görmeden yorum yapamam. Seni takip ettiğimi sanmıyorum
— nawfal

5

veya sadece bir yöntem oluşturun

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

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

veya

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

kullanım:

IEnumerable<string> items = CreateEnumerable("single");
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.