Pouvez-vous utiliser LINQ dans un objet qui expose seulement Ajouter(), remove(), COUNT(), article() et GetEnumerator() de System.Collections.IEnumerator?LINQ pour un objet qui a seulement GetEnumerator()
Répondre
Les méthodes d'extension LINQ existants travaillent sur des objets mettre en œuvre IEnumerable<T>
. Je suppose que votre objet implémente l'interface non générique IEnumerable
. Dans ce cas, vous pouvez utiliser la méthode d'extension Cast<T>
pour obtenir un wrapper générique IEnumerable<T>
. Par exemple, si les éléments sont de type int
:
var wrapper = myObject.Cast<int>();
Vous pouvez maintenant utiliser LINQ sur l'emballage
Non, vous ne pouvez pas. Toutes les méthodes LINQ sont des méthodes d'extensions pour l'interface IEnumerable<T>
.
Vous devrez donc implémenter IEnumerable<T>
pour utiliser LINQ avec vos propres collections.
Pas directement. Vous pouvez écrire assez facilement un SingleShotEnumerable<T>
si:
public sealed class SingleShotEnumerable<T> : IEnumerable<T>
{
private IEnumerator<T> enumerator;
public SingleShotEnumerable(IEnumerator<T> enumerator)
{
if (enumerator == null)
{
throw new ArgumentNullException("enumerator");
}
this.enumerator = enumerator;
}
public IEnumerator<T> GetEnumerator()
{
if (enumerator == null)
{
throw new InvalidOperationException
("GetEnumerator can only be called once");
}
var ret = enumerator;
enumerator = null;
return ret;
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
Ceci est en supposant que vous réellement ont un IEnumerator<T>
. Si vous n'avez que IEnumerator
, vous pouvez écrire quelque chose de similaire en implémentant seulement IEnumerable
, puis utiliser Cast
ou OfType
pour obtenir un IEnumerable<T>
.
(Note: ceci est thread-safe Vous pouvez faire en sorte avec des serrures si vous vouliez vraiment..)
Vous pouvez alors faire:
var filtered = from person in new SingleShotEnumerable<Person>(personEnumerator)
where person.Age > 18
select person.Name;
... mais vous couldn n'utilisez pas la requête deux fois.
Comment avez-vous dans la situation étrange de n'avoir un IEnumerator<T>
de toute façon? C'est plutôt rare. Voyez si vous pouvez concevoir votre chemin autour de cela pour éviter d'avoir à faire quelque chose comme ce qui précède, ce qui est assez fragile.
(Une alternative serait de « vider » le IEnumerator<T>
à un List<T>
ou quelque chose de similaire, mais qui a des problèmes traitant de grandes ou potentiellement infinies séquences.)
- 1. LINQ pour objet Aide
- 2. de GetEnumerator
- 3. SQLmetal, est-ce seulement un mapper pour linq à sql?
- 4. WPF Application qui a seulement une icône de plateau
- 5. Qui a acheté l'autocomplétion pour linqpad?
- 6. LINQ pour objet de requête
- 7. LINQ objet
- 8. Mise à jour de colonnes dans un objet LINQ avec un autre objet LINQ
- 9. comment supprimer un objet seulement s'il existe sur iPhone SDK?
- 10. boucle à travers un objet qui contient un objet php
- 11. comment récupérer seulement 1 ligne d'un objet
- 12. Comment instancier une classe qui a un constructeur nécessitant un objet d'interface
- 13. Y a-t-il un objet wrapper pour SEL?
- 14. Comment construire un arbre d'expression Linq qui se compare à un objet générique?
- 15. Y a-t-il un moyen de savoir qui détient une référence à un objet?
- 16. Objectif des méthodes qui appellent seulement super?
- 17. Qu'est-ce qui provoquerait un service WCF pour renvoyer un objet de type "objet"
- 18. initialisation LINQ et objet
- 19. Qui est un objet plus léger
- 20. Ajouter un signet qui est seulement javascript, pas une URL
- 21. Étendre pour un appel de bloc seulement
- 22. Vérifier si un objet a le focus
- 23. A rejoint Linq?
- 24. C# | Linq | Subsonic - objet classe
- 25. Interrogation aide pour quelqu'un qui a été LINQ à Sql trop ces derniers temps
- 26. Django - Comment obtenir seulement 2 objet pour une combinaison de champs avec un queryset
- 27. mise en œuvre GetEnumerator en C++
- 28. N'importe qui a un UITypeEditor qui sélectionne les instances System.Type?
- 29. En Python, est-il possible d'accéder à la classe qui contient une méthode, donnée seulement un objet méthode?
- 30. Un textbox/richtextbox qui a la coloration syntaxique? [C#]
Certains types 'System.Windows.Forms', comme' ListViewItemCollection', ne semblent pas implémente 'IEnumerable'. –
@ChrisAkridge: En effet, ils n'implémentent que le non-générique 'IEnumerable'. Mais vous pouvez toujours appeler 'Cast <>' pour créer un 'IEnumerable'. –