2009-06-19 9 views
78

私は通常、このように、配列の構文を使用して単一の値からシーケンスを作成します。好きな方法は、単一の値から新しいIEnumerable <T>シーケンスを作成するか?

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

か、新しいリストを使用。私は、誰かが同じことをするためのより表現力豊かな方法を持っているかどうか聞いてみたいと思います。

+3

を? – CoderDennis

答えて

121

あなたの例は空のシーケンスではなく、1つの要素を持つシーケンスです。あなたが行うことができます文字列の空のシーケンスを作成するには

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

EDIT OPは、彼らが単一の値を作成するために探していた明らかにしました。私は、拡張メソッドになるだろう

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

D'oh、私は気が散った、すみません。私は、単一の値から作成することを意味し、空のインスタンスを作成しませんでした! –

+0

これは '答え'の旗ですか? – n8wrl

+0

このメソッドは、新しい配列を作成するよりも純粋に機能的です。 –

58

では私はあなたが示唆するもの好きですが、省略アレイタイプと

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

ちょうど

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

おそらくこれはEnumerable.Repeatがフードの中で行っていることです。

+4

私はあなたがそれを行うことができたことを知らなかった。私はこれが繰り返しを使うよりもはっきりしていると思う。 –

+1

Yay型の推論。 –

+0

しかし、これはIEnumerableではなく、配列です! – Zodman

20

あるいは短く、

string[] single = { "abc" }; 

:その場合

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

最後は鮮やかです。名前を除いて...あなたの例の文字列のようなIEnumerableを既に実装している型と衝突します。 .AsSingleItemEnumerable()、または単純に.Yield() - > "abc" .Yield() – DanO

+0

@DanOそうです。それは良い名前です。 – nawfal

+6

私はToEnumerableがより適切だと思います。 – Zodman

3

か、単に方法

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

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

または

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

用法作成:空のシーケンスであることをどのように

IEnumerable<string> items = CreateEnumerable("single"); 
関連する問題