2011-01-24 6 views
17

私はクラスfooのインスタンスにあり、IEnumerableとして返したいと思います。これを行うための最善の慣用的な方法はただの1要素の配列を作成しnew[] { foo }のようなものであるIEnumerableとして単一のインスタンスオブジェクトを返します

IEnumerable<foo>.fromInstance(foo) 
+2

[単一項目をIEnumerable として渡す]の複製が可能です。(http://stackoverflow.com/questions/1577822/passing-a-single-item-as-ienumerablet) – nawfal

+0

[単一項目を次のように渡すIEnumerable ](https://stackoverflow.com/questions/1577822/passing-a-single-item-as-ienumerablet) –

答えて

20

オプション:

  • を配列またはリストのように、コレクションクラスのインスタンスを作成します。これはデフォルトでは変更可能ですが、これがあなたのAPIに渡すことができるシーケンスであれば、やや役に立たないでしょう。このようなコレクションの周りにReadOnlyCollection<T>ラッパーを作成することもできます。
  • Botz3000の答えに応じて独自のイテレータブロックを作成してください。
  • .NET 3.5を使用している場合は、LINQのEnumerable.Repeat(item, 1)を使用してください。

ここでの最善の答えは、使用方法によって異なります。 には、シーケンスを使用する別のメソッドを呼び出す必要があり、変更されないことがわかっている場合は、おそらく配列を使用します。

var wholeList = regularList.Concat(new[] { finalValue }); 

私はConcatは、配列を変異させるつもりはないことを自信を持っており、他には何も今までに配列自体への参照を参照してくださいません:たとえば、いくつかの他の配列にConcatを呼び出すために、あなたが望むかもしれません。

シーケンスを他のコードに戻す必要があり、それがどうなるかわからない場合は、おそらくEnumerable.Repeatを使用します。

+0

Rx(http://msdn.microsoft.com/en-us/devlabs/ee794896)を使用する人のためのもう1つのオプションは、EnumerableEx.Returnメソッドです。 –

+0

もっともきれいな方法がありません: 'new [] {item}' – data

+0

@data_smith:「配列やリストのようなコレクションクラスのインスタンスを作成する」のはどうですか? –

12

: は、私は多分...など、新しいリストを作成することなく、次のようなものを

をそれを行うことができますどのタイプのものでもfooと宣言されています。

これは、配列が不変ではないため、誰かがIEnumerable<T>T[]にキャストしてそこの値を変更できることです。しかし、これはかなりありそうもないので、私はそれについて心配しない。

+0

短くて簡潔できれいです。これは一番上にあって受け入れられるべきです。 +1 – data

0

IENumerableは、列挙できるものに使用されることになっています。そのため、単一のインスタンスに対して使用すると、かなり奇妙に見えます。本当に必要な場合は、このようにすることができます。それは良い方法かもしれませんが、これは仕事を得る必要があります。

かかわらず、あなたは、この、あなたが実際には1つの要素のリストを作成しようとしている、そしてそれはそれを作るために何の理由が本当にいない参照する方法の
List<foo> myList = new List<foo>(); 
myList.Add(myInstanceOfFoo); 
IEnumerable myEnumerable = myList.AsEnumerable(); 

リスト。

+3

単一のオブジェクトをIEnumerableに変換する理由はたくさんあります。例えば。IEnumerableを期待するメソッドに渡すか、Maybeモナドなどをエミュレートするために使用することができます。 –

17

あなたはこれを行うことができます:

public IEnumerable<Foo> GetSingleFooAsEnumerable() { 
    yield return singleFoo; 
} 
+0

私はこの応答を2回返します。このテクニックは、特定のメンバ変数を列挙するのにも役立ちます。 – Apelsin

関連する問題