Je souhaite créer une nouvelle instance d'un objet IEnumerable<object>
Puis-je faire ceci?
IEnumerable<object> a = new IEnumerable<object>();
Je souhaite créer une nouvelle instance d'un objet IEnumerable<object>
Puis-je faire ceci?
IEnumerable<object> a = new IEnumerable<object>();
IEnumerable<T>. Vous devez utiliser quelque chose comme List<T>.
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.
Réponses:
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);
IEnumerable<T>est une mauvaise idée IMO.
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();
Une autre solution serait d'utiliser Empty.
IEnumerable<object> a = Enumerable.Empty<object>();
il y a un fil sur SO à ce sujet: est-il préférable d'utiliser Enumerable.Empty () par opposition à new List pour initialiser un IEnumerable?
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>();
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.
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>.
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.
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];
new SomeComInterface()instancie la "CoClass" associée à l'interface plutôt que d'instancier l'interface elle-même?
newavec une interface dans certaines situations.
Tu peux le faire:
IEnumerable<object> list = new List<object>(){1, 4, 5}.AsEnumerable();
CallFunction(list);