Réponse courte : Lorsque vous appelez AddRange
il va itérer en interne chaque élément de votre IEnumerable
et l'ajouter à la liste.
Si tu faisais quelque chose comme ça :
var myList = new List<int>();
myList.AddRange(MyInts());
foreach (int i in myList)
{
Console.Write(i);
}
Vos valeurs seraient alors itérées deux fois, du début à la fin :
- Une fois lors de l'ajout à votre liste
- Alors dans votre
for
boucle
Jouer un peu
Maintenant, supposons que vous ayez créé votre propre méthode d'extension pour AddRange
comme ça :
public static IEnumerable<T> AddRangeLazily<T>(this ICollection<T> col, IEnumerable<T> values)
{
foreach (T i in values)
{
yield return i; // first we yield
col.Add(i); // then we add
}
}
Alors vous pourriez l'utiliser comme ceci :
foreach (int i in myList.AddRangeLazily(MyInts()))
{
Console.Write(i);
}
...et il serait itéré deux fois également, sans aller du début à la fin les deux fois. Il ajouterait paresseusement chaque valeur à la liste/collection et vous permettrait en même temps de faire autre chose (comme l'imprimer sur la sortie) après chaque nouvel élément ajouté.
Si vous aviez une sorte de logique pour arrêter les en ajoutant à la liste au milieu de l'opération, cela devrait être utile en quelque sorte.
L'inconvénient, c'est que AddRangeLazily
c'est-à-dire que les valeurs ne seront ajoutées à la collection qu'une fois que vous aurez itéré sur les éléments suivants AddRangeLazily
comme mon exemple de code. Si tu fais juste ça :
var someList = new List<int>();
someList.AddRangeLazily(MyInts());
if (someList.Any())
// it wouldn't enter here...
...il n'ajoutera pas de valeurs du tout. Si vous voulez ce comportement, vous devez utiliser AddRange
. Forcer l'itérationg sur AddRangeLazily
Mais la méthode de l'autre côté fonctionnerait :
var someList = new List<int>();
someList.AddRangeLazily(MyInts());
if (someList.AddRangeLazily(MyInts()).Count())
// it would enter here...thus adding all values to the someList
...cependant, selon combien paresseux est la méthode que vous appelez, elle n'itérera pas tout. Par exemple :
var someList = new List<int>();
someList.AddRangeLazily(MyInts());
if (someList.AddRangeLazily(MyInts()).Any())
// it would enter here, plus adding only the first value to someList
Depuis Any()
est vrai dès que tout existe, alors Any()
a juste besoin d'une itération pour retourner true
Il n'a donc besoin que du premier élément pour être itéré.
Je ne me souviens pas avoir eu à faire quelque chose comme ça, c'était juste pour m'amuser. yield
.
Fiddle ici ! !!