TreeNode 上 IEnumerator 的参数

发布于 2024-11-14 11:31:11 字数 849 浏览 4 评论 0原文

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

what is the valid argument for IEnumerator on TreeNode?

i got the error on this line:

IEnumerator ie = tn.Nodes.GetEnumerator();

in this method:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

南冥有猫 2024-11-21 11:31:11

(来自评论)

使用泛型类型“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);
        }
    }

(from comments)

Using the generic type 'System.Collections.Generic.IEnumerator' requires '1' type arguments

That means you have

using System.Collections.Generic;

and not

using System.Collections;

switch to the latter and it will work. IEnumerable / IEnumerator are the non-generic API.

Or better: use foreach - it is simpler, safer and more correct (you didn't remember to check for IDisposable, for example).

Additional notes:

  • concatenating strings in a loop is very bad - it causes telescopic string allocations (i.e. lots of intermediate strings); something like StringBuilder is preferred by a long margin
  • building xml by hand is not ideal - you need to encode etc; XmlWriter would be ideal

so IMO: use an XmlWriter that writes to a StringBuilder, using foreach

Untested, but something like:

    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);
        }
    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文