需要使我的递归函数更快地工作

时间:2011-04-10 04:15:47

标签: c# recursion performance

这是导致我“问题”的代码:

private string buildHTMLTree()
{
    Dictionary<string, string> parents = new Dictionary<string, string>();
    Dictionary<string, string> childs = new Dictionary<string, string>();
    ArrayList array = new ArrayList();
    array = simulateInput();

    string html = "";

    foreach (KeywordRows kwd in array)
    {
        if (kwd.root_keyword == kwd.keyword)
        {
            if (!parents.ContainsKey(kwd.keyword))
                parents.Add(kwd.keyword, kwd.root_keyword);
        }
        else
        {
            if (!childs.ContainsKey(kwd.keyword))
                childs.Add(kwd.keyword, kwd.root_keyword);
        }
    }

    html += "<ul id=\"parents\">";
    foreach (string parent in parents.Values)
    {
        html += "<li id=\"" + parent + "\">" + parent;

        if (childs.ContainsValue(parent))
        {
            html += "<ul id=\"parents\">";
            process(ref childs, ref html, parent);
            html += "</ul>";
        }

        html += "</li>";
    }
    html += "</ul>";

    return Properties.Resources.htmlTree_tmpl.Replace("{KEYWORDS}", html);
}

public void process(ref Dictionary<string, string> _childs, ref string _html, string parent)
{
    var getChilds =
    from o in _childs
    where (o.Value == parent)
    select o.Key;

    foreach (var tmp in getChilds)
    {
        string child = tmp.ToString();

        if (_childs.ContainsValue(child))
        {
            _html += "<li id=\"" + child + "\">" + child + "<ul id=\"" + child + "\">";
            process(ref _childs, ref _html, child);
            _html += "</ul></li>";
        }
        else
        {
            _html += "<li id=\"" + child + "\">" + child + "</li>";
        }
    }

    return;
}

public class KeywordRows
{
    private string _keyword;
    private string _root_keyword;

    public KeywordRows(string keyword, string root_keyword)
    {
        _keyword = keyword;
        _root_keyword = root_keyword;
    }

    public string keyword
    {
        get
        {
            return _keyword;
        }
        set
        {
            _keyword = value;
        }
    }

    public string root_keyword
    {
        get
        {
            return _root_keyword;
        }
        set
        {
            _root_keyword = value;
        }
    }
}

}

我的问题是我有这个函数用于将2列数据列表转换为嵌套的html树,问题是当这个数据包含很多“行”时,该函数需要永远完成,我没有任何异常,但我让它以100k行数据作为输入运行了15分钟,但没有完成。

我已经整理了一个小型Visual Studio 2010项目来显示问题,它模拟了X大小的输入并执行了该功能。

这是项目:http://www.fileden.com/files/2011/4/10/3112563//HTMLTreeTest.zip

我可以做些什么来更快地完成我的代码?

1 个答案:

答案 0 :(得分:6)

由于字符串连接,发布的代码可能变慢。请改用StringBuilder或更专业的HtmlTextWriter 这是使用StringBuilder的代码,它在更加合理的时间内工作:
http://pastebin.com/0VrM6SLV

您也可以考虑直接写入StreamWriter - 这样可以避免将整个字符串同时存储在内存中,这对于一个非常大的字符串来说是一个好主意。 代码与使用StringBuilder非常相似。我们通过strWri,并使用StreamWriter.Write
http://pastebin.com/5afYdWHM
请注意,我必须拆分模板字符串(HTML包装器)以使其在逻辑上工作 - 如果我们不处理整个字符串,则不能使用String.Replace