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)
时间:原作者:0个回答

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;
}
原作者:
...