Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何订购与LAMBDA的父子关系?_C#_Linq_Recursion_Lambda_Tree - Fatal编程技术网

C# 如何订购与LAMBDA的父子关系?

C# 如何订购与LAMBDA的父子关系?,c#,linq,recursion,lambda,tree,C#,Linq,Recursion,Lambda,Tree,使用LAMBDA编写LINQ查询以将父项(由于父子依赖关系)放在列表的第一位的正确方法是什么 例如,预期输出应该是一个有序列表(名为“Hierarchy”的objecttype),其中包含所有字段ID,类型字符串的父项): ID父项 A2空 A1 A2 A5 A2(取决于A2) A3 A2 A4 A5(取决于A5) 树遍历通常需要某种递归,而且由于C#作为一种语言不支持命名lambda表达式(与命名函数表达式的JavaScript概念不同),我想不出在使用lambdas的纯LINQ查询中干净地

使用LAMBDA编写LINQ查询以将父项(由于父子依赖关系)放在列表的第一位的正确方法是什么

例如,预期输出应该是一个有序列表(名为“Hierarchy”的objecttype),其中包含所有字段ID,类型字符串的父项):

  • ID父项
  • A2空
  • A1 A2
  • A5 A2(取决于A2)
  • A3 A2
  • A4 A5(取决于A5)

树遍历通常需要某种递归,而且由于C#作为一种语言不支持命名lambda表达式(与命名函数表达式的JavaScript概念不同),我想不出在使用lambdas的纯LINQ查询中干净地执行此任务的方法

如果您愿意在外部声明函数委托,这是完全可能的。然而,这段代码对于构建树的传统递归方法没有明显的优势,但是它展示了LINQ/lambda版本的实现

下面是一个使用递归和查找表的示例(为了提高效率):

IEnumerable items=new[]
{
新的ItemType(){ID=“A4”,ParentID=“A5”},
新的ItemType(){ID=“A5”,ParentID=“A2”},
新的ItemType(){ID=“A1”,ParentID=“A2”},
新的ItemType(){ID=“A3”,ParentID=“A2”},
新的ItemType(){ID=“A2”,ParentID=null},
};
var childrenLookup=items.ToLookup(i=>i.ParentID);
Func preOrderTraverse=null;
preOrderTraverse=新函数(项=>
{
var curNode=可枚举。重复(第1项);
var childNodes=childrenLookup[item.ID]
.OrderBy(i=>i.ID)//按ID对同级排序
.选择多个(预订购行程);
返回可枚举的.Union(curNode,childNodes);
});
var preOrderTraversal=childrenLookup[null]。SelectMany(preOrderTraverse);
foreach(预订单Traversal中的var项)
WriteLine($“{item.ID},{item.ParentID}”);
代码的输出是:

A2, A1, A2 A3, A2 A5, A2 A4, A5 A2, A1、A2 A3、A2 A5、A2 A4、A5
列表和列表中对象的类型是否可能重复?从您所写的内容来看,这些是字符串吗?为什么A5显示在A1之前是列表(而两者共享同一父级)?输出是否有特定规则?您的措辞不清楚-据我所知,没有LAMBDA查询-您是指使用LAMBDA表达式的LINQ查询还是使用查询表达式的LINQ查询?预期的输出是什么?和订购单?等级制度?到底是什么? A2, A1, A2 A3, A2 A5, A2 A4, A5