本例中獲取的是所有的晚輩!首先定義家庭成員類:
public class FamilyMember { /// <summary> /// 身份 /// </summary> public string identity { get; set; } public int level { get; set; } /// <summary> /// 父親 /// </summary> public string father { get; set; } }
然后,定義遞歸方法:
/// <summary> /// 遞歸獲取晚輩 /// </summary> /// <param name="members"></param> /// <param name="m"></param> /// <returns></returns> public static List<FamilyMember> GetYoungers(List<FamilyMember> members, FamilyMember m) { var result = new List<FamilyMember>(); //獲取子女 var subordinate = members.Where(e => e.father == m.identity).ToList(); //如果存在子女 if (subordinate != null) { result.AddRange(subordinate); foreach (var subo in subordinate) { result.AddRange(GetYoungers(members, subo)); } } return result; }
方法解釋:
首先,既然是遞歸,肯定是自己調用自己;
然后,在方法體內部:
既然要獲取所有的下屬(晚輩),首先要獲取自己的直屬下屬,並將結果存入“下屬”集合中;
然后通過遞歸,獲取 “直屬下屬的直屬下屬”,同樣存入“下屬”集合中;
最后,返回“下屬”集合。
遞歸測試:
/// <summary> /// 測試遞歸 /// </summary> public static void CheckRecursion() { List<FamilyMember> list = new List<FamilyMember> { new FamilyMember{ identity = "爺爺", level = 1, father = ""}, new FamilyMember{ identity = "爸爸", level = 2, father = "爺爺"}, new FamilyMember{ identity = "叔叔", level = 2, father = "爺爺"}, new FamilyMember{ identity = "自己", level = 3, father = "爸爸"}, new FamilyMember{ identity = "弟弟", level = 3, father = "爸爸"}, new FamilyMember{ identity = "堂兄", level = 3, father = "叔叔"}, new FamilyMember{ identity = "堂弟", level = 3, father = "叔叔"}, new FamilyMember{ identity = "兒子", level = 4, father = "自己"}, new FamilyMember{ identity = "女兒", level = 4, father = "自己"}, new FamilyMember{ identity = "侄子", level = 4, father = "弟弟"}, new FamilyMember{ identity = "侄女", level = 4, father = "弟弟"} }; var self = new FamilyMember { identity = "爺爺", level = 1, father = "" }; var youngers = GetYoungers(list, self).OrderBy(p => p.level).ToList(); if(youngers != null) { foreach(var p in youngers) { Console.WriteLine(p.identity); } } }
調用該方法即可查看效果:

