gpt4 book ai didi

c# - 使用对象的列表遍历对象

转载 作者:太空宇宙 更新时间:2023-11-03 23:07:35 24 4
gpt4 key购买 nike

我有一个小程序可以创建一个简单的菜单。我目前的问题是我有一个对象应该填充主菜单点,然后是所有菜单点。我的问题是,一个 IList 可以有第二个或第三个 IList,我真的不知道如何交互 n 个 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; }
}

最佳答案

我更喜欢通用扩展来展平树形对象

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);

关于c# - 使用对象的列表遍历对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40656366/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com