2009-12-31 7 views
3

J'ai une classe abstraite (Object2D), et plusieurs classe qui hérite Object2D (DisplayObject2D par exemple)C# - itérer à travers des éléments de type donnés à l'intérieur d'une liste <T>

J'utilise une liste pour stocker toutes les références à ces objets.

J'aimerais parcourir tous les objets DisplayObject2D de cette liste.

Jusqu'à présent, le code suivant fonctionne, mais étant nouveau pour le développement C#, je voulais savoir s'il n'y avait pas de meilleure pratique de le faire:

List<Object2D> tmp = objects.FindAll(delegate(Object2D obj) 
             { return obj is DisplayObject2D; }); 
foreach(DisplayObject2D obj in tmp) 
{ 
    ... 
} 

Merci à l'avance!

+1

@ZedK: +1 Bonne question: je m'intéresse à quelque chose sur lequel je travaille en ce moment. Je suis sûr que vous vous rendez compte que vous pouvez utiliser la réponse de George directement dans la boucle foreach, mais je vais le mentionner, juste au cas où: foreach (obj Object2D dans objects.OfType ()) {...}: de Bien sûr, vous pouvez avoir d'autres raisons de conserver les objets filtrés dans 'tmp, vous ne voulez donc pas "tirer et oublier" le résultat du filtrage par Type. – BillW

+0

Oui, c'est ce que je viens de faire (après avoir ajouté l'instruction missing using "System.Linq"), tout est fait en une seule ligne, c'est parfait. Merci! –

Répondre

13
var objects2d = objects.OfType<DisplayObject2D>(); 

si vous voulez un IEnumerable

var listOfObjects2d = objects2d.ToList(); 

si vous voulez une liste

Notez que OfType vous donnera un type plus spécifique

IEnumerable<DisplayObject2D> 

Si ce n'est pas ce que vous attendu, utilisez l'extension Cast pour la renvoyer à un nombre de base de type énumérable.

var listOfObjects2dFilteredByMoreSpecificType = 
objects.OfType<DisplayObject2D>.Cast<Object2D>() 
//.ToList() // until you really need an IList<T> better leave it just an enumerable 
; 
+1

@George +1, merci; votre réponse a éclairci un point de trouble que j'utilisais avec OfType ... J'omettais les parens vides à la fin. – BillW

+0

En fait, "objets" est une liste , et il semble que cette méthode OfType n'existe pas (il n'apparaît pas dans la fenêtre de saisie semi-automatique) =/ Je cherchais "OfType" dans MSDN, mais je n'a pas vraiment compris comment l'utiliser. –

+3

Pour l'utiliser, vous devez déclarer l'utilisation de l'espace de noms System.Linq et faire référence à la DLL System.Core. –

Questions connexes