T
の単一のエンティティをIEnumerable<T>
にキャストするには、C#で便利な方法がありますか?シングルトンIEnumerableを作成するにはどうすればよいですか?
私は考えることができる唯一の方法は、のようなものです:
T entity = new T();
IEnumerable<T> = new List { entity }.AsEnumerable();
そして、私はより良い方法があるはずだと思います。
T
の単一のエンティティをIEnumerable<T>
にキャストするには、C#で便利な方法がありますか?シングルトンIEnumerableを作成するにはどうすればよいですか?
私は考えることができる唯一の方法は、のようなものです:
T entity = new T();
IEnumerable<T> = new List { entity }.AsEnumerable();
そして、私はより良い方法があるはずだと思います。
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);
注:配列コンストラクタの構文ははるかに効率的です(しかし、そのようなマイクロ最適化はしばしば関連しません)。反復法は不変であることが保証されている。 –
私はEnumerable.Repeatを使用すると、バッキングタイプを隠すことができます。また、おそらくループ/利回りで実装されていると仮定しているため、遅延実行の実装の基礎となる可能性があります。 – Sprague
@Sprague: "バッキングタイプを隠す"とは、ジェネリック引数を明示的に指定しないで 'Repeat'を呼び出すことができる場合、暗黙の配列構文(' new [] {t} ')もの。 –
(私はおそらくちょうどそれが唯一の私的使用のためだった場合は特に、ほとんどの状況でvar singleton = new[] { entity };
を行いたいが。)私は
Enumerable.Repeat(entity, 1);
var entity = new T();
var singleton = Enumerable.Repeat(entity, 1);
を使用
不思議なことに、VB.NETはC#よりも冗長です!配列の作成は単に '{entity}'です。 –
@Martinho:C#では 'var x = {y}'ではなく 'T [] x = {y}'や 'var x = new [] {y}'を使うことができます。 – LukeH
が重複する可能性:http://stackoverflow.com/questions/4779442/return-single-instance-object-as-ienumerable [単一のアイテムを渡すの – Justin
可能重複as IEnumerable](http://stackoverflow.com/questions/1577822/passing-a-single-item-as-ienumerablet) –
nawfal