2011-02-10 10 views
15

Tの単一のエンティティをIEnumerable<T>にキャストするには、C#で便利な方法がありますか?シングルトンIEnumerableを作成するにはどうすればよいですか?

私は考えることができる唯一の方法は、のようなものです:

T entity = new T(); 
IEnumerable<T> = new List { entity }.AsEnumerable(); 

そして、私はより良い方法があるはずだと思います。

+3

が重複する可能性:http://stackoverflow.com/questions/4779442/return-single-instance-object-as-ienumerable [単一のアイテムを渡すの – Justin

+0

可能重複as IEnumerable ](http://stackoverflow.com/questions/1577822/passing-a-single-item-as-ienumerablet) – nawfal

答えて

21

AsEnumerable()へのあなたの呼び出しは不要です。 AsEnumerableは、ターゲットオブジェクトがIQueryable<T>を実装している場合に使用されますが、LINQ-to-Objectsを使用する必要があります(LINQ互換のORMでクライアント側のフィルタリングを行う場合など)。 List<T>IEnumerable<T>を実装していますが、IQueryable<T>を実装していないため、その必要はありません。

とにかく、あなたのアイテムで単一要素の配列を作成することもできます。

IEnumerable<T> enumerable = new[] { t }; 

それともEnumerable.Repeat

IEnumerable<T> enumerable = Enumerable.Repeat(t, 1); 
+0

注:配列コンストラクタの構文ははるかに効率的です(しかし、そのようなマイクロ最適化はしばしば関連しません)。反復法は不変であることが保証されている。 –

+1

私はEnumerable.Repeatを使用すると、バッキングタイプを隠すことができます。また、おそらくループ/利回りで実装されていると仮定しているため、遅延実行の実装の基礎となる可能性があります。 – Sprague

+0

@Sprague: "バッキングタイプを隠す"とは、ジェネリック引数を明示的に指定しないで 'Repeat'を呼び出すことができる場合、暗黙の配列構文(' new [] {t} ')もの。 –

5

(私はおそらくちょうどそれが唯一の私的使用のためだった場合は特に、ほとんどの状況でvar singleton = new[] { entity };を行いたいが。)私は

Enumerable.Repeat(entity, 1); 
4
var entity = new T(); 
var singleton = Enumerable.Repeat(entity, 1); 

を使用

+0

不思議なことに、VB.NETはC#よりも冗長です!配列の作成は単に '{entity}'です。 –

+2

@Martinho:C#では 'var x = {y}'ではなく 'T [] x = {y}'や 'var x = new [] {y}'を使うことができます。 – LukeH

関連する問題