2

TreeNode 上 IEnumerator 的有效参数是什么?

我在这一行得到了错误:

IEnumerator ie = tn.Nodes.GetEnumerator();

在这种方法中:

private void parseNode(TreeNode tn)
    {
        IEnumerator ie = tn.Nodes.GetEnumerator();

        string parentnode = "";

        parentnode = tn.Text;

        while (ie.MoveNext())
        {
            TreeNode ctn = (TreeNode)ie.Current;

            if (ctn.GetNodeCount(true) == 0)
            {
                _nodeToString += ctn.Text;
            }
            else
            {
                _nodeToString += "<" + ctn.Text + ">";
            }
            if (ctn.GetNodeCount(true) > 0)
            {
                parseNode(ctn);
            }
        }

        _nodeToString += "</" + parentnode + ">";
        _nodeToString += "\n";
    }
4

1 回答 1

5

(来自评论)

使用泛型类型“System.Collections.Generic.IEnumerator”需要“1”类型参数

这意味着你有

using System.Collections.Generic;

并不是

using System.Collections;

切换到后者,它将起作用。IEnumerable/IEnumerator是非通用 API。

或者更好:使用foreach- 它更简单、更安全、更正确(例如,您不记得检查IDisposable)。

补充笔记:

  • 在循环中连接字符串非常糟糕- 它会导致可伸缩的字符串分配(即大量中间字符串);类似的东西在很大程度上StringBuilder首选
  • 手动构建 xml 并不理想 - 您需要编码等;XmlWriter将是理想的

所以 IMO:使用XmlWriter写入 a 的 a StringBuilder,使用foreach

未经测试,但类似于:

    private string parseNode(TreeNode tn)
    {
        var sb = new StringBuilder();
        using (var writer = XmlWriter.Create(sb))
        {
            writer.WriteStartElement("xml");
            parseNode(tn, writer);
            writer.WriteEndElement();
        }
        return sb.ToString();
    }
    private void parseNode(TreeNode tn, XmlWriter writer)
    {
        if (tn.Nodes.Count > 0)
        {
            writer.WriteStartElement(tn.Text);
            foreach (TreeNode child in tn.Nodes)
            {
                parseNode(child, writer);
            }
            writer.WriteEndElement();
        }
        else
        {
            writer.WriteString(tn.Text);
        }
    }
于 2011-06-05T15:14:52.387 回答