ループ

コレクションを列挙する場合、foreachを使うことが多いのですが、要素が何番目なのか欲しい場合があります。IListが相手ならforで回せば良いですが、IEnumerableの場合だと自分でループカウンタを用意することになって、ちょっと不格好です。しかし、C#3.0だと拡張メソッドがそれなりに充実しているため、そのようなループを簡潔に書くことができます。

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string args)
        {
            string ss = { "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten" };
            ss.Where( (s, i) => i % 2 == 0).ToList().ForEach( (s) => Console.WriteLine(s) );
        }
    }
}
/* 結果
one
three
five
seven
nine
 */

Whereに引数が2つバージョンのFuncを渡すと第二引数がインデックスとなります。ただ、ずっとfor/foreachに慣れてきているので戸惑うかもしれません。

面倒だったので例ではssを配列にしていますが、IEnumerableでも同様です。