Java,C#の列挙の構文

投稿者: | 2011年5月6日

JavaとC#の列挙の構文について。
時々、どういうことだったっけ?と戸惑うことがあるので、メモしておく。

まず、Javaの場合は以下のような感じになる。

// hasNext()で次の要素があるかどうか判定
while( iterator.hasNext() ){
    // next()で次の要素を取得して、イテレータをひとつ進める
    Object o = iterator.next();
}

C#ではIteratorとは言わないでEnumeratorという言い方をするようだ。
以下のような感じになる。

// MoveNext()でインデックスをひとつ進めて、現在位置に要素があるならばtrueを返す
while( enumerator.MoveNext() ){
    // Currentで現在位置の要素を取得
    Object o = enumerator.Current;
}

コードの行数も実行結果も変わらないが、列挙に使う各メソッドの意味が若干異なっているのが分かる。
個人的にはC#のほうがソースコードが読み下しやすい気がする。

ただし、JAVAではJ2SE5から拡張for文が使えるようになったので
while文でイテレータをまわす機会はもうあまり無いかも知れない。
拡張for文は以下のような感じである。

for( Object o:iteratable){
     System.out.println(o);
}

C#でも2.0以降列挙の機能が充実したので、foreach文を使ったり、コレクションクラスのForEachメソッドを使ったりする機会のほうが多いだろう。
さらに、C#3.0からはラムダ式が使えるようになったので、列挙は

myCollection.ForEach(o => Console.WriteLine(o) );

のような感じで書けてしまう。もはやfor文やforeach文やwhile文を書く機会すら無い。
PythonやRubyでもこういった書き方をする方が多いだろう。
JAVAでもこういった感じで書けるようになればいいのだが…。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です