【问题标题】:Argument for IEnumerator on TreeNodeTreeNode 上 IEnumerator 的参数
【发布时间】:2011-06-05 14:58:09
【问题描述】:

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

【问题讨论】:

  • orthoganol 的问题,但为什么不使用foreach (TreeNode node in tn.Nodes)
  • 还有什么错误?知道这会很有帮助...
  • 您是否通过字符串连接构建 xml?这不是一个好主意...XmlWriter 在这里是理想的...
  • 是的.. 我正在为 xml 构建.. :) 错误是错误 1 ​​使用泛型类型 'System.Collections.Generic.IEnumerator' 需要 '1' 类型参数
  • 只想将节点转换为 xml 格式的字符串.. :)

标签: c# tree-nodes


【解决方案1】:

(来自 cmets)

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

这意味着你有

using System.Collections.Generic;

而不是

using System.Collections;

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

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

补充说明:

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

所以 IMO:使用 XmlWriter 写入 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);
        }
    }

【讨论】:

  • 或者使用 System.Collections.IEnumerator 而不是“IEnumerator”。
  • 无论如何,在 writer.WriteStartElement(tn.Text); 处有一个参数异常;它说'f:\'中的名称字符无效。 ':' 字符,十六进制值 0x3A,不能包含在名称中。
  • 啊……我用了换行符……:)
  • @vrynxzent,除非您可以确定所有节点都使用有效的 XML 名称作为文本,否则您应该考虑将文本写入属性或文本而不是节点名称。 &lt;node text="f:\"&gt;...&lt;/node&gt;&lt;node&gt;f:\&lt;node&gt;...&lt;/node&gt;&lt;/node&gt;.
猜你喜欢
  • 2020-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多