IEnumerable <object> a = new IEnumerable <object> (); Puis-je faire ceci?


90

Je souhaite créer une nouvelle instance d'un objet IEnumerable<object>

Puis-je faire ceci?

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


1
Non, et cela n'a même pas de sens.
CodesInChaos

3
@ WingMan20-10: Eh bien, cela change TOUT. Vous ne pouvez pas ajouter à un générique IEnumerable<T>. Vous devez utiliser quelque chose comme List<T>.
jason

1
Dans ce cas, vous avez besoin d'un tableau concret List <object> objs = new IEnumerable <object>. Vous ne pouvez pas ajouter d'éléments à un itérateur car ce n'est pas une collection ... c'est un itérateur :)
user44298

1
@ivo: Notez que IEnumerable<T>cela ne représente pas un itérateur - cela représente une séquence itérable . IEnumerator<T>lui-même représente l'itérateur.
Jon Skeet

Réponses:


114

Vous pouvez par exemple créer une instance de List<object>, qui implémente IEnumerable<object>. Exemple:

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

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

11
Étant donné que la question montre l'utilisation de génériques, donner un exemple d'un type qui n'implémente pas le générique IEnumerable<T>est une mauvaise idée IMO.
Jon Skeet

Tout problème avec l'utilisation de CallFunction (list.AsEnumerable ()) au lieu de IEnumerable <object> en = list; ...
Gina Marano

J'utiliserais un tableau avec un initialiseur littéral si possible, c'est le type énumérable le plus efficace et le plus léger disponible dans .NET et n'a pas la surcharge d'un List <>. Les listes ne doivent être utilisées que si vous avez vraiment besoin ou souhaitez muter après l'initialisation. En outre, il est préférable d'ajouter System.Linq et d'appeler .AsEnumerable () sur le tableau ou la liste.
Mark le

33

Puisque vous avez maintenant spécifié que vous voulez y ajouter, ce que vous voulez n'est pas un simple IEnumerable<T>mais au moins un ICollection<T>. Je recommande simplement d'utiliser un List<T>comme celui-ci:

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

Vous pouvez utiliser myList partout où un IEnumerable<object>est attendu, puisque List<object>implements IEnumerable<object>.

(ancienne réponse avant clarification)

Vous ne pouvez pas créer une instance de IEnumerable<T>car il s'agit d'une interface normale (il est parfois possible de spécifier une implémentation par défaut, mais elle n'est généralement utilisée qu'avec COM).

Donc, ce que vous voulez vraiment, c'est instancier une classe qui implémente l' interface IEnumerable<T> . Le comportement varie en fonction de la classe que vous choisissez.

Pour une séquence vide, utilisez:

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

Pour un énumérable non vide, vous pouvez utiliser une collection qui implémente IEnumerable<T>. Les choix courants sont le tableau T[], List<T>ou si vous voulez l'immuabilité 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});

Une autre façon courante d'implémenter IEnumerable<T>est la fonctionnalité d'itérateur introduite en C # 3:

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

IEnumerable<object> e4=MyIterator();


24

Non, vous ne pouvez pas car IEnumerablec'est une interface.

Vous devriez être capable de créer une instance vide de la plupart des types non-interface qui implémentent IEnumerable, par exemple: -

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

ou

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

@AdamRalph: J'ai voté contre, puis j'ai été distrait, donc je n'ai pas pu laisser de commentaire immédiatement. Les interfaces sont des types, donc votre réponse est dangereusement fausse car elle propage une idée fausse courante.
jason

7

Non ... tu ne peux pas faire ça. Utilisez plutôt la ligne de code suivante:

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

J'espère que cela aide.


1

Je voulais créer un nouvel objet ou une nouvelle liste énumérable et pouvoir y ajouter.

Ce commentaire change tout. Vous ne pouvez pas ajouter à un générique IEnumerable<T>. Si vous voulez rester avec les interfaces System.Collections.Generic, vous devez utiliser une classe qui implémente ICollection<T>comme List<T>.


1

La raison principale est que nous ne pouvons pas créer d'objet d'une interface, et IEnumerable est une interface . Nous devons créer un objet de la classe qui implémente l'interface. C'est la raison principale pour laquelle nous ne pouvons pas créer directement un objet de IEnumerable.


0

Non IEnumerable est une interface, vous ne pouvez pas créer d'instance d'interface

tu peux faire quelque chose comme ça

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

Est-il possible de créer une instance de l'interface COM comme ça @Jon Skeet?
Arsen Mkrtchyan


1
Je pense qu'il est possible de spécifier une implémentation par défaut qui est instanciée au lieu de l'interface pour les interfaces COM.
CodesInChaos

@JonSkeet n'est-il pas plus précis de dire que l'appel new SomeComInterface()instancie la "CoClass" associée à l'interface plutôt que d'instancier l'interface elle-même?
phoog

@phoog: Ce serait exact - mais ce qui est important et étrange, c'est que vous pouvez l'utiliser newavec une interface dans certaines situations.
Jon Skeet

0

Tu peux le faire:

IEnumerable<object> list = new List<object>(){1, 4, 5}.AsEnumerable();
CallFunction(list);
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.