2

再帰関数を作成するたびに、void を返して ref パラメーターを使用することになるようです。

結果リストを返すだけの関数を書けるようになりたいです。

答えが非常に単純である場合はお詫び申し上げます-何らかの理由で私にはわかりません。

これが私が今持っているコードです:

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;
        }
    }
}

プロトタイプに書き直すことができるかどうか知りたいです:

public static List<XDocument> GetResources(string startURL)
4

4 に答える 4

1

さて、たまに使っている柄がありますので、オプションで見せたかったです。しかし、私が書かれたとおりに取り組んでみたとき、私の脳は少し動揺していたので、代わりに私たちはあなたに見せるための簡単なバージョンを理解するだけであるという合意に達しました(私の脳と私)。

それはあなたの特定の質問に完全に当てはまるわけではないかもしれませんが、それは私が過去に変更不可能な方法で物事をやりたいと思ったときに使用した方法の1つであり、あなたが探していたもののようでした。

    public string IntCSVReverse(List<int> IntList)
    {
        return IntCSVReverse_recurse(IntList, 0);
    }

    private string IntCSVReverse_recurse(List<int> IntList, int Index)
    {
        if (Index == (IntList.Count - 1))
            return IntList[Index].ToString();
        else
            return
                IntCSVReverse_recurse(IntList, Index + 1)
                + "," + IntList[Index].ToString();
    }

だから、それが価値があるもののためのパターンがあります。これはXMLではなく、分岐もしませんが、たとえば、を変更して同じことを実装しようとするよりも、非変更再帰を実装するのが簡単で、(私にとって)理解しやすい場合の簡潔な例ですStringBuilder

実際、あなたの特定の例は、最初に作成された単一のリストの戻り値を使用した2段階のソリューションとして、(私には)より適切に流れるように見えます。:)

于 2011-08-16T00:12:21.063 に答える