В настоящее время я пытаюсь создать класс, который реализует IEnumerable<T>
, чтобы построить иерархию из плоского списка объектов, имеющих ссылки друг на друга через свойство ParentId. Я хотел бы написать свободно интерфейс для этого, так что я могу сделать что-то вроде этого«Выбирает новый» в linq запускает оценку/нагрузку?
IEnumerable<Tab> tabs = GetTabs();
IEnumerable<TabNode> tabNodes = tabs.AsHierarchy().WithStartLevel(2).WithMaxDepth(5);
Итак, об утверждении выхода, я задаюсь вопросом, могу ли я сделать что-то вроде этого в моем NodeHierarchy : IEnumerable<TabNode>
классе:
private IEnumerable<TabNode> _nodes;
public NodeHierarchy(IEnumerable<Tab> tabs)
{
_nodes = CreateHierarchy(tabs);
}
public IEnumerable<TabNode> CreateHierarchy(IEnumerable<Tab> tabs)
{
/* About this block: I'm trying to find the top level
nodes of the first tab collection, maybe this is done poorly? */
var tabIds = tabs.Select(t => t.TabID);
IEnumerable<TabNode> nodes = from tab in tabs
where !tabIds.Contains(tab.ParentId)
select new TabNode {
Tab = node,
ChildNodes = CreateHierarchy(tabs, node.TabID, 1),
Depth = 1 };
return nodes;
}
, или я должен был бы сделать что-то вроде этого:
private IEnumerable<TabNode> _nodes;
public NodeHierarchy(IEnumerable<Tab> tabs)
{
_nodes = CreateHierarchy(tabs);
}
public IEnumerable<TabNode> CreateHierarchy(IEnumerable<Tab> tabs)
{
var tabIds = tabs.Select(t => t.TabID);
IEnumerable<Tab> startingNodes = from tab in tabs
where !tabIds.Contains(tab.ParentId)
select tab;
foreach(Tab node in startingNodes)
{
yield return
new TabNode()
{
Tab = node,
ChildNodes = CreateHierarchy(tabs, node.TabID, 1),
Depth = 1
};
}
Не могли бы вы переформатировать свой код, используя пробелы вместо вкладок? На данный момент это довольно непроницаемо. –
Да, я знаю, спасибо, я над этим работаю ... работа с копией не работала здесь :) – kitsune
Должно быть исправлено сейчас ... – kitsune