使用对象列表

时间:2016-11-17 13:36:30

标签: c#

我有一个小程序,应该创建一个简单的菜单。 我当前的问题是我有一个对象应该填充主菜单点然后所有菜单点下。 我的问题是,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; }
    }

2 个答案:

答案 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();

相关问题