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でもこういった感じで書けるようになればいいのだが…。