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.