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書き込むStringBuilderforeach

テストされていませんが、次のようなものです:

    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 に答える