IEnumerable <オブジェクト> a = new IEnumerable <オブジェクト>(); できますか?


90

オブジェクトの新しいインスタンスを作成したい IEnumerable<object>

できますか?

IEnumerable<object> a = new IEnumerable<object>();


1
いいえ、それは意味がありません。
CodesInChaos、2011年

3
@ WingMan20-10:まあ、それはすべてを変える。ジェネリックに追加することはできませんIEnumerable<T>。のようなものを使用する必要がありますList<T>
ジェイソン

1
この場合、具体的な配列List <object> objs = new IEnumerable <object>が必要です。コレクションではないため、イテレータにアイテムを追加できません...イテレータ:)
user44298

1
@ivo:IEnumerable<T>イテレーターを表すのではなく、反復可能なシーケンスを表すことに注意してください。IEnumerator<T>それ自体がイテレータを表します。
Jon Skeet、2011年

回答:


114

たとえばList<object>、を実装するのインスタンスを作成できますIEnumerable<object>。例:

List<object> list = new List<object>();
list.Add(1);
list.Add(4);
list.Add(5);

IEnumerable<object> en = list;
CallFunction(en);

11
質問がジェネリックの使用を示していることを考えると、ジェネリックを実装しない型の例を考えるIEnumerable<T>と、悪い考えであるIMOです。
Jon Skeet、2011年

IEnumerable <object> en = list; ...の代わりにCallFunction(list.AsEnumerable())を使用する場合の問題
Gina Marano

可能であれば、リテラル初期化子付きの配列を使用します。これは、.NETで利用できる最も効率的で軽量な列挙型であり、List <>のオーバーヘッドがありません。リストは、初期化後に本当に変更する必要がある場合、または変更したい場合にのみ使用してください。また、System.Linqを追加して、配列またはリストで.AsEnumerable()を呼び出すことをお勧めします。
マーク・

33

追加したいことを指定したので、必要なのは単純ではなく、IEnumerable<T>少なくともICollection<T>です。私は単にList<T>このようなものを使用することをお勧めします:

List<object> myList=new List<object>();
myList.Add(1);
myList.Add(2);
myList.Add(3);

IEnumerable<object>はをList<object>実装してIEnumerable<object>いるので、予想されるすべての場所でmyListを使用できます。

(明確化前の古い回答)

IEnumerable<T>通常のインターフェイスであるため、のインスタンスを作成できません(デフォルトの実装を指定できる場合もありますが、通常はCOMでのみ使用されます)。

したがって、本当に必要なのは、インターフェースを実装するクラスをインスタンス化することです。動作は、選択したクラスによって異なります。 IEnumerable<T>

空のシーケンスを使用する場合:

IEnumerable<object> e0=Enumerable.Empty<object>();

空でない列挙可能な場合は、を実装するコレクションを使用できますIEnumerable<T>。一般的な選択肢は、配列T[]List<T>または不変性が必要な場合ですReadOnlyCollection<T>

IEnumerable<object> e1=new object[]{1,2,3};
IEnumerable<object> e2=new List<object>(){1,2,3};
IEnumerable<object> e3=new ReadOnlyCollection(new object[]{1,2,3});

もう1つの一般的な実装方法IEnumerable<T>は、C#3で導入されたイテレーター機能です

IEnumerable<object> MyIterator()
{
  yield return 1;
  yield return 2;
  yield return 3;
}

IEnumerable<object> e4=MyIterator();


24

いいえ、それIEnumerableはインターフェースなのでできません。

を実装するほとんどの非インターフェースタイプの空のインスタンスを作成できるはずですIEnumerable

IEnumerable<object> a = new object[] { };

または

IEnumerable<object> a = new List<object>();

@AdamRalph:私は反対票を投じた後、気が散ってしまい、すぐにコメントを残すことができませんでした。インターフェースはタイプであるため、一般的な誤解を広めるため、答えは危険なほど間違っています。
ジェイソン


1

新しい列挙可能なオブジェクトまたはリストを作成し、それに追加できるようにしたいと思っていました。

このコメントはすべてを変えます。ジェネリックに追加することはできませんIEnumerable<T>。のインターフェイスSystem.Collections.Genericを使い続けたい場合は、のICollection<T>ように実装するクラスを使用する必要がありますList<T>


1

主な理由は、インターフェイスのオブジェクトを作成できないことと、IEnumerableがインターフェイスであることです。インターフェイスを実装するクラスのオブジェクトを作成する必要があります。これが、IEnumerableのオブジェクトを直接作成できない主な理由です。


0

IEnumerableはインターフェイスではありません。インターフェイスのインスタンスを作成できません

あなたはこのようなことをすることができます

IEnumerable<object> a = new object[0];

@Jon SkeetのようなCOMインターフェイスのインスタンスを作成することは可能ですか?
Arsen Mkrtchyan


1
COMインターフェイスの代わりに、インスタンス化されるデフォルトの実装を指定することは可能だと思います。
CodesInChaos、2011年

@JonSkeetを呼び出すとnew SomeComInterface()、インターフェイス自体をインスタンス化するのではなく、インターフェイスに関連付けられた「CoClass」をインスタンス化すると言う方が正確ではありませんか?
phoog

@phoog:それは正確です-しかし、重要で奇妙なことはnew、特定の状況でインターフェースを使用できることです。
Jon Skeet、2012

0

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

IEnumerable<object> list = new List<object>(){1, 4, 5}.AsEnumerable();
CallFunction(list);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.