次のタイプのデータ構造をトラバースできるイテレータを作成するのに問題があります。
と呼ばれるクラスがあり、Expression
1つのデータメンバーがありa List<object>
ます。
このリストには任意の数の子を含めることができ、それらの子の一部は他のExpressionオブジェクトである可能性があります。
この構造をトラバースして、リスト以外のすべてのオブジェクトを印刷したいのですが(もちろん、リストの要素を印刷したいのですが)、リストに入る前に「beginnest」を返したいと思います。リストを終了しました。「endnest」を返したいです。
可能な限りクラスを無視し、subExpressionが必要な場合はアイテムを含むList<object>
オブジェクトを持っていれば、これを行うことができましたが、これを廃止し、代わりにサブリストとしてsを使用します(オブジェクトに対して操作を実行します。で拡張メソッドを使用できることは承知していますが、適切ではありません(引数をとらないリストのメソッドが必要なのは誰ですか?)。List<object>
Expression
List<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;
}