2010-06-04 2 views
2

У меня есть класс herichary следующегоShallow копирования списка с понижающим приведением

CEntity ----> CNode ---> CElement

У меня есть

class Nodes : List<Cnode> 

и

Class Elements : List<Element> 

Класс узла содержит общий элемент, общий для разных проектов Класс элемента имеет элемент ic к проекту.

Я должен неглубокой копию список элементов в список узлов (в основном вниз отливать элементы узлов)

ответ

1

Предположив вы используете .NET 3.0 или выше, следующий код создает новый список с теми же самыми элементами downcasted к CNodes:

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

Тогда (если уже нет), вы должны создать конструктор, принимающий в классе узлов в List<CNode> и сделать:

var shallowCopyNodes = new Nodes(shallowCopyNodesList); 
+0

Я сделал nodes.addrange (elements.Cast () .ToList()); Его работает отлично. Спасибо – Mohit

1

Вы можете просто сделать это:

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

Где элементов списка.

Вам не нужно беспокоиться о возврате в CNode, поскольку CElement наследует это. Важно отметить, что элементы в списке узлов (в приведенном выше примере) фактически являются экземплярами CElement. Если вы хотите CNode вы, вероятно, придется создать новый экземпляр CNode с помощью конструктора копирования:

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

И добавить новый экземпляр CNode:

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

Контравариантность существует только на [интерфейсах] (http://msdn.microsoft.com/en-us/library/dd233059.aspx), а не на конкретных классах (например, List), так что часть не будет работать. – R0MANARMY

+0

@ROMANARMY: на самом деле он работает для интерфейсов и типов делегатов, но ваш вопрос по-прежнему верен: он не работает для 'List '. –

+0

Хороший вопрос! Удалено –

0

Вы можете использовать оператор Cast в LINQ.

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

Это не создает новую копию списка, просто перечислимую по старой коллекции. Вам нужно позвонить в «ToList», чтобы он работал. – R0MANARMY

0

То, что я сделал это

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

и

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

но будет ли проблема производительности/памяти в этом подходе.

Смежные вопросы