C#函数局部递归
函数局部递归,使用Lambda表达式,将函数本身当作参数传递给本身
public delegate Func<XmlNode,Cali> Group_Parameter_Del(Group_Parameter_Del self); private void UpdateCalibration(ref Calibration_Version calibration_Version,string path) { XmlDocument xmlDTC = new XmlDocument(); xmlDTC.Load(path); //加载Xml文件 XmlElement rootElem = xmlDTC.DocumentElement; //获取根节点 XmlNodeList versionNodes = rootElem.GetElementsByTagName("Version"); if (versionNodes != null) { foreach (XmlNode versionItem in versionNodes) { calibration_Version.Version = versionItem.Attributes["version"].InnerText; calibration_Version.Calibrations = new List<Calibration>(); foreach (XmlNode cali_Item in versionItem.ChildNodes) { Calibration tempCalibration = new Calibration(); tempCalibration.Model = cali_Item.Attributes["module"].InnerText; tempCalibration.CalibrationFuctions = new List<Calibration_Fuction>(); foreach (XmlNode fun_Item in cali_Item) { Calibration_Fuction tempFunc = new Calibration_Fuction(); tempFunc.Name = fun_Item.Attributes["name"].InnerText; tempFunc.CalibrationGroup = new List<Calibration_Group>(); //匿名函数实现,实际上相当于在函数内部声明并实现一个匿名函数 Group_Parameter_Del del = (Group_Parameter_Del _del) => (XmlNode tempNode) => { if (tempNode.Name == "Group") { Calibration_Group tempGroup = new Calibration_Group(); tempGroup.GroupName = tempNode.Attributes["name"].InnerText; tempGroup.CalibrationParameters = new List<Calibration_Parameters>(); foreach (XmlNode item in tempNode) { if(item.Name== "Parameters") { tempGroup.CalibrationParameters.Add(_del(_del)(item) as Calibration_Parameters);//调用自身 } } return tempGroup; } else//Parameters { Calibration_Parameters tempParameter = new Calibration_Parameters(); tempParameter.Type = tempNode.Attributes["type"].InnerText; tempParameter.CalibrationGroup = new List<Calibration_Group>(); tempParameter.CalibrationParameter = new List<Calibration_Parameter>(); foreach (XmlNode item in tempNode) { if (item.Name == "Parameter")//递归到最底层 { Calibration_Parameter tempParam = new Calibration_Parameter(); tempParam.Name = item.Attributes["name"].InnerText; tempParameter.CalibrationParameter.Add(tempParam); } else//group { if(item.Name == "Group") { tempParameter.CalibrationGroup.Add(_del(_del)(item) as Calibration_Group);//调用自身 } } } return tempParameter; } }; foreach (XmlNode item in fun_Item)//遍历group { tempFunc.CalibrationGroup.Add(del(del)(item) as Calibration_Group);//调用匿名递归函数 } tempCalibration.CalibrationFuctions.Add(tempFunc); } calibration_Version.Calibrations.Add(tempCalibration); } } } }
另在附简单代码
delegate Func<int, int> F(F self); F fac = (F f) => (int n) => n == 1 ? 1 : n * f(f)(n - 1); fac(fac)(5)
浙公网安备 33010602011771号