【发布时间】:2017-02-18 08:58:54
【问题描述】:
我不知道这个问题的正确命名是什么。
定义很简单,就是一个层次列表(我也可以生成扁平列表)
Simply show hierarchy view
hierarchy I able to get
1
-->2
-->3
-->4
-->5
-->6
flattened list I able to get
[1, 2, 3, 4, 5, 6]
我想要的结果是
[
[1,2],
[1,3,4],
[1,3,5],
[1,6],
]
我的示例课程
public class MemberNetworkViewModel
{
public int MemberGenerationNumber { get; set; }
public int MemberId { get; set; }
public int ParentId{ get; set; }
public List<MemberNetworkViewModel> children { get; set; }
}
我可以做最难的方法是尝试获取此层次结构列表中的最后一个节点,然后foeeach 他们并一一获取其父节点。但我认为会有更好的方法,有什么想法吗?
当前的解决方案(绕过,我知道很乱,也许通过 linq 寻求更短的帮助?)
public List<List<MemberNetworkViewModel>> GetAllPossibleNetworkTreePath(
List<MemberNetworkViewModel> flatternMemberNetworkViewModel)
{
var possibleTreePaths = new List<List<MemberNetworkViewModel>>();
var lastNodes =
flatternMemberNetworkViewModel.Where(
x => flatternMemberNetworkViewModel.All(y => y.ParentId!= x.MemberId));
foreach (var lastNode in lastNodes)
{
var memberNetworkViewModels = new List<MemberNetworkViewModel>();
memberNetworkViewModels.Add(lastNode);
for (int index = 0; index < lastNode.MemberGenerationNumber; index++)
{
var parent =
flatternMemberNetworkViewModel.FirstOrDefault(
x => x.MemberId == memberNetworkViewModels.Last().ParentId);
memberNetworkViewModels.Add(parent);
}
memberNetworkViewModels = (from x in memberNetworkViewModels
orderby x.MemberGenerationNumber
select x).ToList();
possibleTreePaths.Add(memberNetworkViewModels);
}
return possibleTreePaths;
}
【问题讨论】:
-
看起来很复杂......我会用树来代替
-
那么你的子列表就是从root到leaf的路径,需要的话可以很容易的获取到
-
@CedricDruck 因为我需要根据树路径进行一些检查。我知道听起来很好奇,但这是客户要求的。所以我认为我自己的建议是更好的方法?
-
我不确定我是否理解这个问题。你能在代码中显示源列表,并在代码中显示所需的列表吗?
-
为什么是
1,2,3,4而不是1,3,4???还是那个错字