Le type IEnumerable<T>
ne prend pas en charge de telles opérations. Le but de la IEnumerable<T>
est de permettre à un consommateur de visualiser le contenu d'une collection. Pas de modifier les valeurs.
Lorsque vous effectuez des opérations telles que .ToList().Add(), vous créez un nouveau fichier de type List<T>
et en ajoutant une valeur à cette liste. Il n'y a aucun lien avec la liste d'origine.
Ce que vous pouvez faire est d'utiliser la méthode d'extension Add pour créer une nouvelle IEnumerable<T>
avec la valeur ajoutée.
items = items.Add("msg2");
Même dans ce cas, il ne modifiera pas l'original. IEnumerable<T>
objet. Cela peut être vérifié en détenant une référence à cet objet. Par exemple
var items = new string[]{"foo"};
var temp = items;
items = items.Add("bar");
Après cet ensemble d'opérations, la variable temp ne fera toujours référence qu'à un énumérable avec un seul élément "foo" dans l'ensemble de valeurs, tandis que les éléments feront référence à un énumérable différent avec les valeurs "foo" et "bar".
EDIT
J'oublie constamment que la méthode Add n'est pas une méthode d'extension typique de l'application IEnumerable<T>
parce que c'est l'un des premiers que je finis par définir. Le voici
public static IEnumerable<T> Add<T>(this IEnumerable<T> e, T value) {
foreach ( var cur in e) {
yield return cur;
}
yield return value;
}
6 votes
IEnumerable<T>
est destiné à l'interrogation des collections uniquement. C'est l'épine dorsale du cadre LINQ. C'est toujours une abstraction d'une autre collection telle queCollection<T>
,List<T>
oArray
. L'interface fournit uniquement unGetEnumerator
qui renvoie une instance deIEnumerator<T>
qui permet de parcourir la collection étendue un élément à la fois. Les méthodes d'extension LINQ sont limitées par cette interface.IEnumerable<T>
est conçu pour être lu uniquement car il peut représenter une agrégation de parties de plusieurs collections.3 votes
Pour cet exemple, il suffit de déclarer
IList<T>
au lieu deIEnumerable<T>
:IList<T> items = new T[]{new T("msg")}; items.Add(new T("msg2"));