CSharp - 关于递归函数返回 List的递归函数,C# 如何转换具有副作用的递归过程?

  显示原文与译文双语对照的内容
71 2

似乎每次我去写一个递归函数,最终让它返回void并使用a 参数。

我更愿意写一个函数,它返回结果 List 。

如果答案很简单,那么很抱歉,因为它是elludes的。

下面是我现在拥有的代码:


public static void GetResrouces(string startURL, ref List<XDocument> result)


{


 var doc = XDocument.Parse(GetXml(startURL));//GetXml ommitted - returns xml string


 var xs = new XmlSerializer(typeof(resourceList));


 var rdr = doc.CreateReader();


 if (xs.CanDeserialize(rdr))


 {


 var rl = (resourceList)xs.Deserialize(doc.CreateReader());



 foreach (var item in rl.resourceURL)


 {


 GetResrouces(startURL + item.location, ref result);


 }


 }


 else


 {


 result.Add(doc);


 }


}



public partial class resourceList


{



 private resourceListResourceURL[] resourceURLField;



 private string locationField;



///<remarks/>


 [System.Xml.Serialization.XmlElementAttribute("resourceURL")]


 public resourceListResourceURL[] resourceURL


 {


 get


 {


 return this.resourceURLField;


 }


 set


 {


 this.resourceURLField = value;


 }


 }



///<remarks/>


 [System.Xml.Serialization.XmlAttributeAttribute(DataType ="anyURI")]


 public string location


 {


 get


 {


 return this.locationField;


 }


 set


 {


 this.locationField = value;


 }


 }


}



我想知道它是否可以被改写为 Prototype:


public static List<XDocument> GetResources(string startURL)



时间: 原作者:

72 4

我想是这样的:


public static List<XDocument> GetResources(string startURL)


{


 var result = new List<XDocument>();


 var doc = XDocument.Parse(GetXml(startURL));


 var xs = new XmlSerializer(typeof(resourceList));


 var rdr = doc.CreateReader();


 if (xs.CanDeserialize(rdr))


 {


 var rl = (resourceList)xs.Deserialize(doc.CreateReader());



 foreach (var item in rl.resourceURL)


 {


 result.AddRange(GetResources(startURL + item.location));


 }


 }


 else


 {


 result.Add(doc);


 }


 return result;


}



原作者:
146 5

代码看起来很好,因为( 减去参数中不必要的ref 。) 一个选项是将递归方法封装在非递归的伙伴中:


public static List<XDocument> GetResources(string startURL)


{


 List<XDocument> retDocs = new List<XDocument>();


 GetResources(startURL, retDocs);



 return retDocs;


}



原作者:
...