Liste.AddRange avec IEnumerable<T> paramètre ne fonctionne pas?
J'ai le scénario suivant, où je veux ajouter des éléments à une Liste...
List<T> items = new List<T>();
IEnumerable<T> addItems = someCollection.Where(...);
items.AddRange(addItems);
L'aide de ce code, des éléments sont ajoutés à la liste, mais si j'ajoute un .ToList() après Linq déclaration, puis les éléments sont ajoutés correctement. Je suppose que cela est dû à exécution différée, mais j'aurais pensé que, compte tenu de la Liste.AddRange fonction accepte un IEnumerable qu'il serait d'énumérer les éléments à ajouter.
Quelqu'un peut-veuillez éclaircir pourquoi cela se produit?
C'est le C#, droit?
Désolé, oui C# (4.0)
Comment voyez-vous la "aucun élément n'est ajouté", parce qu'il doit ajouter des éléments?
quel est le type de someCollection? Veuillez fournir le code qui fonctionne réellement, je ne suis pas tout à fait sûr où ToList doit être ajouté. Est someCollection IQueryable et est-il possible qu'il y est une mauvaise mise en œuvre fournisseur Linq?
Désolé, oui C# (4.0)
Comment voyez-vous la "aucun élément n'est ajouté", parce qu'il doit ajouter des éléments?
quel est le type de someCollection? Veuillez fournir le code qui fonctionne réellement, je ne suis pas tout à fait sûr où ToList doit être ajouté. Est someCollection IQueryable et est-il possible qu'il y est une mauvaise mise en œuvre fournisseur Linq?
OriginalL'auteur John | 2012-07-31
Vous devez vous connecter pour publier un commentaire.
Il n'. Il y a un court-circuit pour la
ICollection<T>
(que vous ne frappez pas dans ce cas), qui serait la cause de l'utilisationICollection<T>.CopyTo
au lieu d'énumérer les éléments, mais autrement, il va énumérer la collection.Pour un exemple, essayez:
Il utilise votre code exact, et permet d'imprimer 500 (le nombre d'éléments dans la
List<T>
).someCollection
dans le cas des OP exemple est d'un type qui a mis en placeCopyTo
avec une définition vide?Oui - il est possible qu'il y ait quelque chose d'autre se passe. Mais, en général, cela fonctionne correctement avec
IEnumerable<T>
- ce n'est pas une "exécution différée".qu'elle aurait besoin de l'OP d'avoir leur propre "et Où" la méthode qui crée le
ICollection<T>
avec d'étranges mise en œuvre)La droite. Semble beaucoup plus probable que l'OP se trompe à propos de quelque chose... mais qui sait.
OriginalL'auteur Reed Copsey
Il fonctionne. Voici un test unitaire qui le prouve:
Peut-être il ya quelque chose dans votre scénario spécifique qui ne fonctionne pas correctement.
OriginalL'auteur Pablo Romeo
J'ai essayé de le ci-dessous et
AddRange(IEnumerable<T>)
fonctionneOriginalL'auteur HatSoft
Merci pour les réponses. J'ai essayé de simplifier le code de cet exemple, mais comme d'habitude, le diable est dans les détails!
Entre l' .Où() et le AddRange() composez le code a été (deep down) de compensation de la source ('articles' dans cet exemple) de la liste. Le développeur n'a pas réalisé que le filtre a été reporté jusqu'à la AddRange() appel à quel point ils avaient déjà effacé de la liste source.
Heureux de savoir que je n'ai pas perdu le fil 🙂
OriginalL'auteur John