コガネブログ

平日更新を目標にUnityやC#などのゲーム開発アレコレを書いていきます

【C#】配列やリストを逆順に処理する拡張メソッド

はじめに

var array = new []{ 1, 2, 3, 4, 5 };
for ( int i = array.Length - 1; 0 <= i; i-- )
{
    Debug.Log( array[ i ] );
    // 5
    // 4
    // 3
    // 2
    // 1
}

配列やリストを末尾から処理したい場合、上記のようなループ構文を書きますが

for ( int i = array.Length - 1; 0 <= i; i-- )

この一行を書くのがわりとメンドウなので普段は下記のような拡張メソッドを使っています

ソースコード

using System;
using System.Collections.Generic;

/// <summary>
/// IList 型の拡張メソッドを管理するクラス
/// </summary>
public static class IListExtensions
{
    /// <summary>
    /// IList 型のインスタンスの各要素に対して、指定された処理を逆順に実行します
    /// </summary>
    public static void ForEachReverse<T>( this IList<T> self, Action<T> act )
    {
        for ( int i = self.Count - 1; 0 <= i; i-- ) 
        {
            act( self[ i ] );
        }
    }
    
    /// <summary>
    /// IList 型のインスタンスの各要素に対して、指定された処理を逆順に実行します
    /// </summary>
    public static void ForEachReverse<T>( this IList<T> self, Action<T, int> act )
    {
        for ( int i = self.Count - 1; 0 <= i; i-- ) 
        {
            act( self[ i ], i );
        }
    }
}

使い方

var array = new []{ 1, 2, 3, 4, 5 };
array.ForEachReverse( c => Debug.Log( c ) );
// 5
// 4
// 3
// 2
// 1

var list = new List<int>{ 1, 2, 3, 4, 5 };
list.ForEachReverse( c => Debug.Log( c ) );
// 5
// 4
// 3
// 2
// 1