2010-02-11 5 views
9

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

21

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.

+0

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é. –

+0

Pourquoi en effet Microsoft n'a pas fait de ControlCollection une collection fortement typée (de type Control)? – BornToCode

1

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

+0

doit être IEnumerable

+1

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 ). –

+0

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 –

4

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.

Questions connexes