foreachという役に立つときもあるの

またC#を掘り出して勉強してる。
で、いろいろ書いているのだが、便利な機能foreachを使えるようにIEnumerableを実装してみた。
IEnumerableというのは繰り返し動作できますという印のインターフェース。
以前、比較可能であることを示すIComparableを示したが…
まぁそんなところです。
で、メリットはIEnumerableなやつは全部foreachだけでいけるということ。
何にもかんがえなくていいということ。
target1とtarget2の中身を両方まわしながら掛け算したものを足し続けるメソッドは

public static int test(foos target1,foos target2){
int sum=0;
foreach(foo now1 in target1)
foreach(foo now2 in target2)
sum += now1*now2;
return sum;
}

1つの例だ。なかなかスマート。
ただ、これは読み出す順番はよくわからないから、配列で使ってもうまみはあまりない。
コレクションで使うのに便利。コレクションは扱いめんどくさいし。
ソートすれば順番も整うという裏情報もあるし。
なんで裏情報なのかというとforeachは、読み出す順番はなんでもいいことになってるから。
1,2,3,4,5の順で読むことが多いかもしれないけど、3,5,2,1,4と読んでもいい。
なのであまり信用しないほうがいいですね。
で、実装がめんどくさい。
というのもIEnumerableつけて、GetEnumeratorメソッドを作るというのはまぁいい。
で、そのクラスの繰り返し用のクラスも作らないといけない、これこそEnumerator。
それにはIEnumeratorインターフェースを実装しないといけない。
非常に手間だ。といいながらつけていったけど。
これでforeachできる。
こういうことを配列・コレクションはしてあるということだ。
さて、作ってるプログラムだが、今はひたすらクラス作り。
それぞれ意味のある動きをつけて行っているので、こいつらを利用して書いていけばいい。
あまり中身で何をしてるかは気にしなくていいので、楽になってくるはず。
以前Cで書いたプログラムなんだけど、理解に苦しんだからな。
自分で書いておきながらだ。知らん人が見たら間違えなく意味不明だ。
C#で書くとどうだろうか。