単一の値から新しいIEnumerable <T>シーケンスを作成するお気に入りの方法は?


97

私は通常、次のように配列構文を使用して単一の値からシーケンスを作成します。

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

または、新しいリストを使用します。誰かが同じことをもっと表現力豊かに行う方法があるかどうか知りたいのですが。


3
空のシーケンスはどうですか?
CoderDennis 2009年

dotnetにまだのようなものがないのは、恥ずかしいことEnumerable.From<T>(params T[] items)です。
おやすみオタクプライド

回答:


144

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

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

EDIT OPは、単一の値を作成することを検討していることを明確にしました。その場合

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

おお、気が散った、ごめんなさい。空のインスタンスを作成するのではなく、単一の値から作成することを意味しました!
Marcel Lamothe、

これが「答え」のフラグです。
n8wrl 2009年

この方法は、新しい配列を作成するよりも純粋に機能的です。
Roy Tinker、2011年

69

私はあなたが提案するものが好きですが、配列タイプは省略されています:

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

4
あなたがそれができるとは思いもしませんでした。これはリピートを使用するよりも明確だと思います。
Marcel Lamothe、

1
しかし、これはIEnumerableではなく、配列です!
ゾッドマン

4
@ブライアン・ワッツ私はそれを知っていますが、それはIEnumerableの具体的な実装です。問題は、IEnumerable <>を要求することです(例がそうでない場合でも)。違いがあります。
Zodman

多分質問は変更されるべきです。
Zodman 2013

1
@Jonesopolis:それは別の無関係な状況です。あなたはTask.FromResultそれを達成するために使うことができます。
ブライアンワッツ

21

またはもっと短く、

string[] single = { "abc" };

私は拡張メソッドを作成します:

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で行われていることです。


1
最後は見事です。名前を除いて...例の文字列など、すでにIEnumerableを実装している型と競合します。.AsSingleItemEnumerable()、または単に.Yield()-> "abc" .Yield()を試してください
DanO

7
ToEnumerableの方が適切だと思います。
ゾードマン

2
+1 Yieldは良いです。私も作りIEnumerable<T> Yield<T>(this T source, params T[] others)ました。
Jodrell 2014

ラムダを優先して、Yieldを完全に廃止しようとしましたが、どういうわけかコンパイルできませんでした... cf. stackoverflow.com/questions/1217729/… ;-)。
ピーター-モニカ

@PeterSchneiderどうやってそしてなぜあなたはそれをしたのですか?コードを見ずにコメントすることはできません。私はあなたに従うとは思わない。
nawfal 2015年

5

または単にメソッドを作成する

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");
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.