2009-06-04 7 views
0

Tenir compte des classes suivantes:Passing et Liste de traitement <> types contenant des objets du même type de base

class TypeA; 
class TypeB : TypeA; 
class TypeC : TypeA; 
class TypeD : TypeA; 

et la liste suivante <> Types:

List<TypeB> listTypeB; 
List<TypeC> listTypeC; 
List<TypeD> listTypeD; 

maintenant TypeA a une propriété Prop1 de type Object1 et je veux localiser quelle liste a stocké en son sein un élément avec Prop1 d'une valeur donnée. Existe-t-il un moyen de faire quelque chose comme ce qui suit, de sorte que j'ai seulement besoin d'écrire le code de recherche une fois?

bool LocateInAnyList(Object1 findObj) 
{ 
    bool found = false; 

    found = ContainsProp1(findObj, listTypeB); 
    if(!found) 
    { 
    found = ContainsProp1(findObj, listTypeC); 
    } 
    if(!found) 
    { 
    found = ContainsProp1(findObj, listTypeD); 
    } 
    return found; 
} 


bool ContainsProp1(Object1 searchFor, List<TypeA> listToSearch) 
{ 
    bool found = false; 

    for(int i = 0; (i < listToSearch.Count) & !found; i++) 
    { 
     found = listToSearch[i].Prop1 == searchFor; 
    } 
    return found; 
} 

Répondre

3

Vous pouvez utiliser générique

bool ContainsProp1<T>(Object1 searchFor, List<T> listToSearch) where T : TypeA 
{ 
    bool found = false; 

    for(int i = 0; (i < listToSearch.Count) & !found; i++) 
    { 
     found = listToSearch[i].Prop1 == searchFor; 
    } 
    return found; 
} 

Si vous pouvez utiliser LINQ, votre code peut être plus clair que cela.

+0

Merci qui fonctionne bien. – ChrisBD

-1

Vous ne serez pas vraiment en mesure de le faire de cette manière jusqu'à C# 4.0 sort en raison du soutien de la variance/covariance ajoutée.

Vous pouvez pirater pour l'instant en permettant à l'utilisateur de passer en IEnumerable, et juste en boucle sur que tout en jetant l'objet à TypeA

bool ContainsProp1(Object1 searchFor, IEnumerable listToSearch) 
{ 
    bool found = false; 

    foreach(object obj in listToSearch) 
    { 
     found = ((TypeA)obj).Prop1 == searchFor; 
     if (found) break; 
    } 
    return found; 
} 
+0

Covariance est inutile pour ce scénario . – mquander

5

Oui. Vous aurez besoin de faire de la « contient » méthode générique, avec une contrainte pour que vous puissiez fonctionner uniquement sur des objets qui dérivent de TypeA (et ont donc un Prop1 :)

bool ContainsProp1<T>(Object1 searchFor, List<T> listToSearch) where T : TypeA 
{ 
    bool found = false; 

    for(int i = 0; (i < listToSearch.Count) & !found; i++) 
    { 
     found = listToSearch[i].Prop1 == searchFor; 
    } 
    return found; 
} 

Votre première méthode devrait ensuite compiler comme -est.

+0

Etes-vous sûr que compile comme ça? –

+0

J'ai enlevé mon côlon extra typé; à part ça, oui, ça me va bien. – mquander

+0

Fermer - malheureusement, la syntaxe ybo était correcte pour la définition de la fonction, mais elle a de toute façon +1. – ChrisBD

1

Vous pouvez faire quelque chose comme ça (en utilisant lambdas & génériques & belles choses comme ça):

public bool LocateInAnyList(Object1 obj) 
{ 
    return SearchList(listTypeB, obj) || SearchList(listTypeC, obj) || SearchList(listTypeD, obj); 
} 

private static bool SearchList<T>(List<T> list, Object1 obj) where T : TypeA 
{ 
    return list.Exists(item => item.Prop1 == obj); 
} 
+0

Personnellement, je dirais que cela devrait être la réponse acceptée. Il est assez bien documenté que ces méthodes basées sur les délégués sont plus rapides que l'itération à travers la liste à la main. De plus, c'est beaucoup plus élégant. – MPritchard

-1

Oui. Tout d'abord, vous pouvez faire la méthode générique, en changeant sa signature comme ce qui suit:

bool ContainsProp(Object searchFor, List<T> listToSearch) : where T : TypeA {} 

cela vous permettra de passer l'une des listes que vous avez.

En second lieu, je changerais le second paramètre pour recevoir un tableau de listes:

bool ContainsProp<T>(Object searchFor, List<T> [] listsToSearch) where T : TypeA {} 

De cette façon, vous pouvez passer toutes les listes à la fois:

found = ContainsProp(objToSearch, listA, listB, listC); 
+0

avez-vous même vérifié la compilation de vos exemples? – MPritchard

+0

Oui. Il ne compile pas parce que je ne montre pas toute l'implémentation, juste la signature de la méthode, comme je l'ai mentionné dans la première ligne. –

Questions connexes