Sélection LINQ par type d’object

J’ai une collection qui contient deux types d’objects A & B.

Class Base{} Class A : Base {} Class B : Base {} List collection = new List(); collection.Add(new A()); collection.Add(new B()); collection.Add(new A()); collection.Add(new A()); collection.Add(new B()); 

Maintenant, je veux sélectionner les objects de la collection en fonction de son type (A ou B, pas les deux).

Comment puis-je écrire une requête LINQ pour cela? Aidez-moi, s’il vous plaît. Sinon, je dois parcourir la collection, ce que je ne veux pas. Merci.

Modifier:

Merci à tous pour votre aide. Maintenant, je peux utiliser OfType () à partir de LINQ. Mais je pense que dans mon cas ça ne marchera pas. Ma situation est

 Class Container { List bases; } List containers = new List(); 

Maintenant, je veux sélectionner le conteneur parmi les conteneurs, qui ont au moins un type A. Peut-être que cela ne peut pas être fait par LINQ. Merci beaucoup.

Vous pouvez utiliser la méthode OfType Linq pour cela:

 var ofTypeA = collection.OfType(); 

En ce qui concerne votre réticence à parcourir la collection, vous devez garder à l’esprit que Linq ne fait pas de tours de magie; Je n’ai pas vérifié l’implémentation de OfType , mais je serais surpris de ne pas y trouver de boucle ou d’iterator.

Vous pouvez utiliser la méthode d’extension OfType pour cela

 IEnumerable filteredToA = list.OfType(); IEnumerable filteredToB = list.OfType(); 

Pour être complet, voici le code source de Enumerable.OfType .

 public static IEnumerable OfType(this IEnumerable source) { if (source == null) throw Error.ArgumentNull("source"); return OfTypeIterator(source); } static IEnumerable OfTypeIterator(IEnumerable source) { foreach (object obj in source) { if (obj is TResult) yield return (TResult)obj; } } 

Vous pouvez voir qu’il évalue paresseusement le stream source.