日期:2014-05-20  浏览次数:20962 次

LINQ 递归 关注,,,, 网上找不到材料...... 用一条LINQ 递归......求大侠.....
用一条LINQ 递归......求大侠

最简单的一种,希望大侠能给我点提示/........


id subid
1 2
2 3
3 4
a b
b 5
a 6
c 7
: :
: :
: :



给出.id = 3  

递归求出. 相关连的 id  
为 1,2,3 


关注....


------解决方案--------------------
也许不用LINQ更好吧,但如果你坚持的话,大概这样吧

using System;
using System.Collections.Generic;
using System.Linq;

class Node
{
public string ID { get;set;}
public string ParentID { get;set;}
}

static class NodeExtension
{
public static IEnumerable<Node> GetAncestors(this IEnumerable<Node> nodes, string parentID)
{
var parentNodes = from node in nodes 
where node.ID == parentID 
select node;

foreach(var node in parentNodes)
{
yield return node;
}

foreach(var node in parentNodes)
{
foreach(var p in nodes.GetAncestors(node.ParentID))
yield return p;
}


}
}

class TestID
{
static void Main()
{
List<Node> nodes = new List<Node>
{
new Node {ID = "1", ParentID=null},
new Node {ID = "2", ParentID="1"},
new Node {ID = "3", ParentID="2"},
new Node {ID = "4", ParentID="3"},
new Node {ID = "5", ParentID="4"},
new Node {ID = "a", ParentID="5"},
new Node {ID = "b", ParentID="a"}
};

var ancensters = nodes.GetAncestors("3");

foreach(var node in ancensters)
Console.WriteLine("{0}={1}",node.ID,node.ParentID);

 }
}
------解决方案--------------------
LS的做法其实与LINQ无关。


这种问题当然最好的办法就是递归,树形结构本来就是递归所解决的问题。

SQL是面向集合的而不是面向树的查询语言,LINQ不过是把SQL语法写到程序中。很明显,SQL本来就没法解决树的问题,难道说写到程序中就能解决了?
------解决方案--------------------
实际上,你写一个返回IQueryable<T>的函数(很简单,只有两三条语句)然后在表达式中调用这个函数就能递归了。
------解决方案--------------------
Func<int, int> factorial =
 Extensions.YCombinator<int, int>(
fact =>
n => n < 2 ? 1 : n * fact(n - 1));