我有一个小程序,应该创建一个简单的菜单。 我当前的问题是我有一个对象应该填充主菜单点然后所有菜单点下。 我的问题是,IList可以有第二个或第三个IList,我真的不知道如何与IList进行交互
示例:
MainNodeObj:
NodeDtoId = 1,
ItemCode = 'A'
IList<NodeDTO> ChildMenuNodes
{
MainNodeObj:
NodeDtoId = 2,
ItemCode = '2',
IList<NodeDTO> ChildMenuNodes
{
MainNodeObj:
NodeDtoId = 3,
ItemCode = '3',
}
我的问题是每个ChildNode可以有一个新的子节点,并且对于每个子节点,我将创建一个新对象...听起来很简单,但我不知道如何迭代n个新的子节点
方法:
private IEnumerable<NodeDTO> SortedNodes(int id)
{
var nodes = LoadMenuNodes(id);
foreach (MenuNode menuNode in nodes
.Where(s => s.MenuItemId == null && s.ParentNodeId == null)
.OrderBy(x => x?.Sequence))
{
NodeDTO tmpMenuNode = new NodeDTO();
tmpMenuNode.MenuNodeDtoId = menuNode.Id;
tmpMenuNode.MenuItemCode = menuNode.MenuItem?.Code;
tmpMenuNode.ChildMenuNodes = LoadChildNodes(menuNode.ChildMenuNodes).ToList();
yield return tmpMenuNode;
}
}
private IEnumerable<NodeDTO> LoadChildNodes(MenuNodeList menuNode)
{
foreach (MenuNode childNode in menuNode)
{
NodeDTO tmChildNode = new NodeDTO();
tmChildNode.MenuNodeDtoId = childNode.Id;
tmChildNode.MenuItemCode = childNode?.MenuItem?.Code;
tmChildNode.ChildMenuNodes = null;
yield return tmChildNode;
}
}
public class NodeDTO
{
public int NodeDtoId { get; set; }
public string ItemCode { get; set; }
public IList<NodeDTO> ChildMenuNodes { get; set; }
}
答案 0 :(得分:2)
我更喜欢通用扩展来展平树形样式对象
public static IEnumerable<T> Flatten<T>(this IEnumerable<T> source, Func<T,IEnumerable<T>> selector)
{
return source.SelectMany(o => selector(o).Flatten(selector)).Concat(source);
}
如何致电:
// create a new list for the node
var nodes = new IEnumerable<NodeDTO>();
// add the root node
nodes.Add(rootNode); // add the root node
// flatten the list
var flatList = = rootNode.Flatten(o=> o.ChildMenuNodes);
答案 1 :(得分:1)
你不能只使用一个可靠的功能
将其放在LoadChildNodes函数中。
tmpChildNode.ChildMenuNodes = LoadChildNodes(childNode.ChildMenuNodes).ToList();