2010-03-22 4 views
3

J'ai deux listes: une de type A et une de type Aa. le type Aa est héritée de A. Type donc:Propriété publique La liste doit concaténer 2 types avec héritage

List<A> listA = new List<A>(); 
List<Aa> listAa = new List<Aa>(); 

avec

class Aa : A 

Je:

public property Lists<A> 
{ 
    get 
    { 
    List<A> newList = new List<A>(); 
    //return concat of both lists 
    foreach(List l in listA) 
    { 
     newList.Add(l); 
    } 
    foreach(List l in listAa) 
    { 
     newList.Add(l); 
    } 
} 

Puis-je utiliser une certaine façon Concat au lieu de la boucle foreach? c'est-à-dire

get 
{ 
    return listA.Concat(listAa); 
} // this doesn't work 

Et d'autre part, comment faire la partie ensemble de la propriété?

set 
{ 
    //figure out the type of variable value and put into appropriate list? 
} 
+0

@Obalix: De l'original, je ne suis pas sûr à 100% ces listes étaient génériques et non System.Collections.List .. –

+0

@Reed Copsey: vient de faire la mise en forme ... :-) ... et selon le PO de Bernard les listes sont définies comme Liste et Liste . – AxelEckenberger

+0

Ahh, d'accord - n'était pas évident à partir du texte original, qui avait: "List listA = new List();", etc ... suggérant une utilisation non générique. –

Répondre

2

Si ceux-ci sont des listes génériques, comme suit:

List<A> listA; 
List<Aa> listAa; 

Vous devriez être en mesure de le faire:

public IList<A> Lists 
{ 
    get 
    { 
     return listA.Concat(listB.Cast<A>()).ToList(); 
    } 
} 

L'appel à Enumerable.Cast vous permettra de convertir la List<Aa> en un IEnumerable<A> (puisque Aa est une sous-classe de A), ce qui fera fonctionner Concat. Vous pouvez ensuite le convertir en List<A> en appelant le ToList().

En ce qui concerne l'accesseur de propriété - je ne recommanderais pas de faire de cette propriété un accesseur de propriété. Cela va se comporter d'une manière très non-standard. Au lieu de cela, il serait probablement une bien meilleure idée de faire une méthode personnalisée pour gérer la mise en place des listes.

Si vous allez passer dans une seule liste, contenant Aa et A classes, vous pouvez utiliser quelque chose comme:

public void SetLists(IEnumerable<A> newElements) 
{ 
    this.listA.Clear(); 
    this.listAa.Clear(); 
    foreach(A aElem in newElements) 
    { 
     Aa aaElem = aElem as Aa; 
     if (aaElem != null) 
      this.listAa.Add(aaElem); 
     else 
      this.listA.Add(aElem); 
    } 
} 

Dans ce cas, faire la boucle sera effectivement plus efficace que d'essayer de Utilisez LINQ pour définir ces tableaux, car vous aurez besoin d'un filtrage étrange.

0

aussi, il travaillera en 4.0 .net sans un casting en raison de covariance

Questions connexes