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.