Мелкое копирование списка с понижением - PullRequest
2 голосов
/ 04 июня 2010

У меня есть класс наследования следующим образом

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

У меня есть

class Nodes : List<Cnode>

и

Class Elements : List<Element>

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

Мне нужно поверхностно скопировать список элементов в список узлов (в основном, приведение элементов к узлам)

Ответы [ 4 ]

1 голос
/ 04 июня 2010

Вы могли бы просто сделать это:

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 голос
/ 04 июня 2010

Предположим, что вы используете .net 3.0 или выше, следующий код создает НОВЫЙ список с теми же элементами, которые понижены до CNodes:

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

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

var shallowCopyNodes = new Nodes(shallowCopyNodesList);
0 голосов
/ 07 июня 2010

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

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

и

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

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

0 голосов
/ 04 июня 2010

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

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