Аргумент для IEnumerator на TreeNode - PullRequest
2 голосов
/ 05 июня 2011

Каков действительный аргумент для IEnumerator на TreeNode?

я получил ошибку в этой строке:

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

1 Ответ

5 голосов
/ 05 июня 2011

(из комментариев)

Использование универсального типа '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);
        }
    }
...