J'utilise LINQ depuis un certain temps (et je l'apprécie), mais j'ai l'impression de toucher une speedbump lorsque je cours sur des collections spécialisées .NET (DataRowCollection, ControlCollection). Existe-t-il un moyen d'utiliser LINQ avec ces contrôles spécialisés, et si ce n'est pas le cas, pensez-vous que Microsoft abordera cette question dans la prochaine version du framework? Ou sommes-nous laissés à itérer sur ceux-ci de la manière non-LINQ, ou nous tirer nous-mêmes les éléments hors de la collection dans des collections compatibles LINQ?Microsoft publiera-t-il toutes les collections utilisables par LINQ?
Répondre
La raison pour laquelle les collections comme ControlCollection
ne fonctionnent pas avec LINQ est qu'ils ne sont pas fortement typés. Sans un type d'élément, LINQ ne peut pas créer de méthodes fortement typées. Tant que vous connaissez le type, vous pouvez utiliser la méthode Cast
pour créer une énumération fortement typée et donc être utilisée avec LINQ. Par exemple
ControlCollection col = ...
var query = col.Cast<Control>().Where(x => ...);
Quant à la volonté de Microsoft jamais faire ces mettre en œuvre IEnumerable<T>
par défaut. Ma conjecture est non ici. La raison en est que cela est un changement de rupture et peut provoquer un comportement attendu dans le code. Même la simple implémentation de IEnumerable<Control>
pour ControlCollection
entraînerait des modifications de la résolution de surcharge qui peuvent, et presque certainement, interrompre les applications utilisateur.
La raison est la suivante: Collections qui ne mettent pas en œuvre IEnumerable<T>
ou IQueryable, ne peuvent pas être réitérés dans LINQ
doit être IEnumerable
Eh bien, toutes les collections implémente IEnumerable (sinon vous ne seriez pas en mesure de les parcourir). Mais pour pouvoir être utilisé par linq, ils devront implémenter la version générique (IEnumerable
J'ai mentionné la version générique de IEnumerable, mais SOF (éditeur de texte) ne me laisse pas le faire. Je ne l'ai pas remarqué tôt, j'ai fait la correction. Merci quand même –
Vous devriez être en mesure de faire quelque chose comme ceci:
myDataRowCollection.Cast<DataRow>().Where.....
et utiliser LINQ façon. Si vous connaissez les objets de la collection, vous devriez pouvoir l'utiliser.
Voilà la réponse. J'ai oublié de jeter. Microsoft pourrait encore ajouter Strongly Type Collections pour ControlCollection et autres. Merci et merci à tous ceux qui ont contribué. –
Pourquoi en effet Microsoft n'a pas fait de ControlCollection une collection fortement typée (de type Control)? – BornToCode