0

次のタイプのデータ構造をトラバースできるイテレータを作成するのに問題があります。

と呼ばれるクラスがあり、Expression1つのデータメンバーがありa List<object>ます。

このリストには任意の数の子を含めることができ、それらの子の一部は他のExpressionオブジェクトである可能性があります。

この構造をトラバースして、リスト以外のすべてのオブジェクトを印刷したいのですが(もちろん、リストの要素を印刷したいのですが)、リストに入る前に「beginnest」を返したいと思います。リストを終了しました。「endnest」を返したいです。

可能な限りクラスを無視し、subExpressionが必要な場合はアイテムを含むList<object>オブジェクトを持っていれば、これを行うことができましたが、これを廃止し、代わりにサブリストとしてsを使用します(オブジェクトに対して操作を実行します。で拡張メソッドを使用できることは承知していますが、適切ではありません(引数をとらないリストのメソッドが必要なのは誰ですか?)。List<object>ExpressionList<object>Evaluate

元のイテレータ(動作する)を生成するために使用したコードは次のとおりです。

    public IEnumerator GetEnumerator(){
        return theIterator(expr).GetEnumerator();
    }
    private IEnumerable theIterator(object root) {
        if ((root is List<object>)){
            yield return " begin nest ";
            foreach (var item in (List<object>)root){
                foreach (var item2 in theIterator(item)){
                    yield return item2;
                }
            }
            yield return " end nest ";
        }
        else
            yield return root;
    }

for式の型スワップがList<object>機能せず、stackOverflowエラーが発生しました。イテレータはどのように実装する必要がありますか?

更新:スワップされたコードは次のとおりです。

    public IEnumerator GetEnumerator() {
        return this.GetEnumerator();
    }
    private IEnumerable theIterator(object root) {
        if ((root is Expression)) {
            yield return " begin nest ";
            foreach (var item in (Expression)root) {
                foreach (var item2 in theIterator(item))
                    yield return item2;
            }
            yield return " end nest ";
        }
        else
            yield return root;
    }
4

2 に答える 2

2

あなたが得ている理由StackOverflowExceptionはそれです

foreach (var item in (Expression)root)

…内部的に原因:

((Expression)root).GetEnumerator()

…呼び出される–これは、ループitemの各反復中に変数に割り当てる必要のあるオブジェクトをCLRが列挙する方法です。foreach

あなたの場合、GetEnumerator()呼び出しはtheIterator同じに対して再度実行されroot、それによって無限再帰に入ります。

問題を解決するには、次のものを交換する必要があります。

foreach (var item in (Expression)root)

…と:

foreach (var item in ((Expression)root).expr)

…プロパティexprの名前はどこにありますかList<object>

于 2012-06-03T22:36:01.023 に答える
2

なぜGetEnumerator()帰国したのthis.GetEnumerator()ですか?

それがあなたのスタックオーバーフローが発生しているところだと私には思えます。

戻してみtheIterator(this).GetEnumerator()ませんか?

于 2012-06-03T22:37:55.533 に答える