2010-06-04 24 views
2

je la herichary de classe comme suitcopie peu profonde une liste avec downcasting

CEntity ----> Nœuds-C ---> CElement

J'ai un

class Nodes : List<Cnode> 

et

Class Elements : List<Element> 

La classe de noeud contient un élément commun commun à différents projets La classe d'élément a un élément spécifique ic à un projet.

je dois copie superficielle de la liste des éléments dans la liste des nœuds (essentiellement renversons les éléments aux noeuds)

Répondre

1

Supposant que vous utilisez .net 3.0 ou plus, le code suivant crée une nouvelle liste avec les mêmes éléments downcasted à RCEOM:

List<CNode> shallowCopyNodesList = elements.Cast<CNode>().ToList(); 

ensuite (si pas déjà), vous devez créer un constructeur de prendre une List<CNode> en classe et faire des nœuds:

var shallowCopyNodes = new Nodes(shallowCopyNodesList); 
+0

J'avais fait nodes.addrange (éléments.Cast () .ToList()); Cela fonctionne très bien. Merci – Mohit

1

Vous pouvez simplement faire ceci:

List<CNode> nodes = new List<CNode>(); 
foreach (CElement element in elements) { 
    nodes.Add(element); 
} 

Où les éléments sont une liste.

Vous n'avez pas besoin de vous soucier de retourner à CNode, car CElement en hérite. La chose importante à noter est que les éléments de la liste des nœuds (dans l'exemple ci-dessus) sont en fait des instances de CElement. Si vous vouliez Nœuds-C vous auriez probablement créer une nouvelle instance de Nœuds-C en utilisant un constructeur de copie:

public CNode(CNode instance) 
{ 
    this.Property = instance.Property; 
} 

Et ajouter une nouvelle instance de Nœuds-C:

nodes.Add(new CNode(element)); 
+1

Contravariance est seulement sur [interfaces] (http://msdn.microsoft.com/en-us/library/dd233059.aspx), pas sur des classes concrètes (comme List), de sorte que cette partie ne fonctionnera pas. – R0MANARMY

+0

@ROMANARMY: en fait cela fonctionne pour les interfaces et les types de délégués, mais votre point est toujours correct: Cela ne fonctionne pas pour 'List '. –

+0

Bon point! Remis –

0

Vous pouvez utiliser l'opérateur Cast dans LINQ.

var nodelist = elementList.Cast<CNode>() 
        .ToList(); 
+0

Cela ne crée pas une nouvelle copie de la liste, juste un énumérable sur l'ancienne collection. Vous avez besoin d'un appel à 'ToList' pour le faire fonctionner. – R0MANARMY

0

Ce que je l'ai fait est

nodes.addrange(ElementList.ConvertAll(new Converter<Elements, CNode>(ConvertElementsToNode)))); 

et

public static CNode ConvertElementsToNode(Element ele) 
    { 
     return ((CNode) ele); 
    } // ConvertElementsToNode 

, mais il y aura une question de performance/mémoire dans cette approche.