読者です 読者をやめる 読者になる 読者になる

雑記 - otherwise

最近はDQ10しかやっていないダメ技術者がちまちまと綴る雑記帳

foreach でループ回数を取得する

C#

なるほど〜。と感心しつつ、 foreach と Select で 2 回まわっちゃっているのがちょっとなぁ、と思ったので、別の方法を。

class Test {
  static void Main(){
    LinkedList<string> name = new LinkedList<string>();

    name.AddLast("福沢祐巳");
    name.AddLast("小笠原祥子");
    name.AddLast("水野蓉子");
    name.AddLast("島津由乃");
    name.AddLast("支倉令");
    name.AddLast("鳥居江利子");
    name.AddLast("藤堂志摩子");
    name.AddLast("佐藤聖");
    name.AddLast("松平瞳子");
    name.AddLast("有馬菜々");
    name.AddLast("二条乃梨子");

    name.ForEach((i, n) => { Console.WriteLine("{0}:{1}", i + 1, n); });
  }
}

public static class CollectionExtention {
  public static void ForEach<T>(this ICollection<T> list, Action<int, T> action) {
    for (int i = 0; i < list.Count; i++) {
      action(i, list.ElementAt(i));
    }
  }
}

……拡張メソッドを使って書いてみました。(これでいいのかいまいち不安。とりあえず、コンパイルは通ったし動作確認もしましたが)
一応、ループ回数は減ったのかな。
でも ElementAt() を使っているので、パフォーマンス改善にはなっていない気がする。。。
まぁ、 ICollection を拡張しているので、使い勝手はそれなりにあるかも。