回数サンドイッチ

class Program
{
    static void Main()
    {
        // 何でもいい配列
        var array = Enumerable.Repeat("a", 10);

        // foreachで素直っぽくindexを付ける
        foreach (var item in array.Select((value, index) => new { value, index }))
        {
            Console.WriteLine("{0}:{1}", item.index, item.value);
        }

        // 拡張メソッドにしちゃう
        foreach (var item in array.WithIndex())
        {
            Console.WriteLine("{0}:{1}", item.Key, item.Value);
        }

        // foreachで使う場合は普通に外側にcount用の変数置いた方が……
        // indexの取れない拡張メソッド(ToLookupとか)へのチェイン時には便利に使えるかも
        var splittedArray = array.WithIndex().ToLookup(kvp => kvp.Key < 5, kvp => kvp.Value);
    }
}

public static class ExtMethods
{
    public static IEnumerable<KeyValuePair<int, T>> WithIndex<T>(this IEnumerable<T> source)
    {
        int index = 0;
        foreach (var item in source)
        {
            yield return new KeyValuePair<int, T>(index++, item);
        }
    }
}

最近は、どこにでもあるゲーム雑感サイト→どこにでもあるプログラミング雑感サイト、に無理矢理シフトしようとして浮ついた無理無理感が漂っていますが、別に特にシフトしたいわけでもなく、せっかくなので3月は集中的に書いてみようかな、と思っただけですが空気的に不評な雰囲気を感じちゃってたりしなかったりは、とりあえず無視黙殺で進めようかと思うこの頃ですがいかがお過ごしでしょうか。

前々回、前回からまだ続いて、Selectでindexを取る話。[C#]何度目の動きを見て、便利便利と思ったので簡単に使えるように拡張メソッドに放り込んでみた。KeyValuePairなんて名前じゃなくてIndexValuePairが良いんですが(笑) あるものは、そのまんま使うということで。

それ自体は別にforeachの外側にカウント用の変数置けばいいぢゃーん、という気がしなくもなくて困ったので、言い訳として、幾つかのメソッドがインデックス取れないから中間に挟む用として便利!と思うことにした。SelectとかWhereとか、大抵のものはFunc<T,int,TResult>も用意されているんだけどね。ToLookupとか、一部のものには無いんだね。

Profile

Yoshifumi Kawai

Cysharp, Inc
CEO/CTO

Microsoft MVP for Developer Technologies(C#)
April 2011
|
July 2024

Twitter:@neuecc GitHub:neuecc

Archive