IEnumerable <Objekt> a = neues IEnumerable <Objekt> (); Kann ich das tun?


90

Ich möchte eine neue Instanz eines Objekts erstellen IEnumerable<object>

Kann ich das tun?

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


1
Nein, und es macht nicht einmal Sinn.
CodesInChaos

3
@ WingMan20-10: Nun, das ändert ALLES. Sie können nicht zu einem Generikum hinzufügen IEnumerable<T>. Sie müssen so etwas wie verwenden List<T>.
Jason

1
In diesem Fall benötigen Sie ein konkretes Array List <Objekt> objs = new IEnumerable <Objekt>. Sie können einem Iterator keine Elemente hinzufügen, da es sich nicht um eine Sammlung handelt, sondern um einen Iterator :)
user44298

1
@ivo: Beachten Sie, dass IEnumerable<T>dies keinen Iterator darstellt, sondern eine iterierbare Sequenz. IEnumerator<T>selbst repräsentiert den Iterator.
Jon Skeet

Antworten:


113

Sie können beispielsweise eine Instanz von erstellen List<object>, die implementiert wird IEnumerable<object>. Beispiel:

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

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

11
Angesichts der Tatsache, dass die Frage die Verwendung von Generika zeigt, ist ein Beispiel für einen Typ, der das Generikum nicht implementiert, IEnumerable<T>eine schlechte Idee, IMO.
Jon Skeet

Jedes Problem mit der Verwendung von CallFunction (list.AsEnumerable ()) anstelle von IEnumerable <object> en = list; ...
Gina Marano

Wenn möglich, würde ich ein Array mit Literal-Initialisierer verwenden. Es ist der effizienteste und leichteste Aufzählungstyp in .NET und hat nicht den Overhead einer Liste <>. Listen sollten nur verwendet werden, wenn Sie nach der Initialisierung wirklich eine Mutation benötigen oder möchten. Außerdem ist es besser, System.Linq hinzuzufügen und .AsEnumerable () für das Array oder die Liste aufzurufen.
Mark

33

Da Sie jetzt angegeben haben, dass Sie es hinzufügen möchten, ist das, was Sie möchten, nicht einfach, IEnumerable<T>sondern zumindest eine ICollection<T>. Ich empfehle einfach ein List<T>solches zu verwenden:

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

Sie können myList überall dort verwenden, wo dies IEnumerable<object>erwartet wird, da es List<object>implementiert wird IEnumerable<object>.

(alte Antwort vor der Klärung)

Sie können keine Instanz von erstellen, IEnumerable<T>da es sich um eine normale Schnittstelle handelt (manchmal ist es möglich, eine Standardimplementierung anzugeben, diese wird jedoch normalerweise nur mit COM verwendet).

Was Sie also wirklich wollen, ist eine Klasse zu instanziieren , die die Schnittstelle implementiert IEnumerable<T>. Das Verhalten hängt von der gewählten Klasse ab.

Für eine leere Sequenz verwenden Sie:

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

Für eine nicht leere Aufzählung können Sie eine Sammlung verwenden, die implementiert wird IEnumerable<T>. Gemeinsame Entscheidungen sind das Array T[], List<T>oder wenn Sie Unveränderlichkeit wollen 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});

Eine weitere gängige Methode zur Implementierung IEnumerable<T>ist die in C # 3 eingeführte Iteratorfunktion :

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

IEnumerable<object> e4=MyIterator();


24

Nein, das kannst du nicht, da IEnumerablees sich um eine Schnittstelle handelt.

Sie sollten in der Lage sein, eine leere Instanz der meisten Nicht-Schnittstellentypen zu erstellen, die Folgendes implementieren IEnumerable: -

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

oder

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

@AdamRalph: Ich habe abgestimmt und mich dann ablenken lassen, konnte also nicht sofort einen Kommentar hinterlassen. Schnittstellen sind Typen, daher ist Ihre Antwort gefährlich falsch, da sie ein häufiges Missverständnis verbreitet.
Jason

7

Nein, das kannst du nicht. Verwenden Sie stattdessen die folgende Codezeile:

IEnumerable<int> usersIds = new List<int>() {1, 2, 3}.AsEnumerable();

Ich hoffe, es hilft.


1

Ich wollte ein neues aufzählbares Objekt oder eine neue Liste erstellen und es hinzufügen können.

Dieser Kommentar ändert alles. Sie können nicht zu einem Generikum hinzufügen IEnumerable<T>. Wenn Sie mit den Schnittstellen in bleiben möchten System.Collections.Generic, müssen Sie eine Klasse verwenden, die ICollection<T>like implementiert List<T>.


1

Der Hauptgrund ist, dass wir kein Objekt einer Schnittstelle erstellen können und IEnumerable eine Schnittstelle ist . Wir müssen ein Objekt der Klasse erstellen, das die Schnittstelle implementiert. Dies ist der Hauptgrund, warum wir kein Objekt von IEnumerable direkt erstellen können.


0

Kein IEnumerable ist eine Schnittstelle. Sie können keine Instanz der Schnittstelle erstellen

Sie können so etwas tun

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

Ist es möglich, eine Instanz einer COM-Schnittstelle wie diese @ Jon Skeet zu erstellen?
Arsen Mkrtchyan


1
Ich denke, es ist möglich, eine Standardimplementierung anzugeben, die anstelle der Schnittstelle für COM-Schnittstellen instanziiert wird.
CodesInChaos

@ JonSkeet Ist es nicht genauer zu sagen, dass das Aufrufen new SomeComInterface()die zugehörige "CoClass" der Schnittstelle instanziiert, anstatt die Schnittstelle selbst zu instanziieren?
Phoog

@phoog: Das wäre genau - aber das Wichtige und Seltsame ist, dass Sie es newin bestimmten Situationen mit einer Schnittstelle verwenden können.
Jon Skeet

0

Du kannst das:

IEnumerable<object> list = new List<object>(){1, 4, 5}.AsEnumerable();
CallFunction(list);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.