徳島ゲーム開発ごっこ 技術ブログ

ゲームを作るために役に立ったり立たなかったりする技術を学んでいきます!

【C#,LINQ】Reverse~配列やリストの要素の順番を反転したいとき~

 C#のLINQの関数であるReverse()の使い方についてです。
 配列やリストの要素の順番を反転することが出来ます。
f:id:urahimono:20180702001507p:plain


この記事には.NET Framework 4.6.1を使用しています。

順番を反転する

 配列やリストの要素の順番を逆からにしたい!
 そんなときはLINQReverse()ですよ。

public static IEnumerable<TSource> Reverse<TSource>( this IEnumerable<TSource> source );
Enumerable.Reverse(TSource) メソッド (IEnumerable(TSource)) (System.Linq)

 呼ぶだけで簡単に逆になったシーケンスを取得することが出来ます。
 注意してほしい点は、List<T>クラスに関してはReverse()という名前の関数を所持しているため、LINQReverse()を使う場合はAsEnumerable()を使ってください。

Program.cs

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

public static class Program
{

    static void Main( string[] args )
    {
        int[]       dataA   = new int[]         { 0, 1, 2, 3, 4 };
        List<float> dataB   = new List<float>() { 1.5f, 1.3f, 3.2f };
        string[]    dataC   = new string[]      { "正一郎", "清次郎", "誠三郎", "征史郎" };

        // 反転!(ListはReverse()を持っているため、AsEnumerable()を使ってLINQのReverse()を使うようにしています)
        IEnumerable<int>    dataA_R = dataA.Reverse();
        IEnumerable<float>  dataB_R = dataB.AsEnumerable().Reverse();
        IEnumerable<string> dataC_R = dataC.Reverse();

        System.Console.WriteLine( "dataA        :{0}", dataA.Text() );
        System.Console.WriteLine( "dataA Reverse:{0}", dataA_R.Text() );
        System.Console.WriteLine( "dataB        :{0}", dataB.Text() );
        System.Console.WriteLine( "dataB Reverse:{0}", dataB_R.Text() );
        System.Console.WriteLine( "dataC        :{0}", dataC.Text() );
        System.Console.WriteLine( "dataC Reverse:{0}", dataC_R.Text() );

        // 入力待ち用
        System.Console.ReadKey();
    }

    /// <summary>
    /// 簡易的なシーケンスのテキスト取得処理
    /// </summary>
    public static string Text( this IEnumerable i_source )
    {
        string text = string.Empty;
        foreach( var value in i_source )
        {
            text += string.Format( "[{0}], ", value );
        }
        return text;
    }

} // class Program

dataA :[0], [1], [2], [3], [4],
dataA Reverse:[4], [3], [2], [1], [0],
dataB :[1.5], [1.3], [3.2],
dataB Reverse:[3.2], [1.3], [1.5],
dataC :[正一郎], [清次郎], [誠三郎], [征史郎],
dataC Reverse:[征史郎], [誠三郎], [清次郎], [正一郎],

 こんな感じでReverse()を七兆回使って世界を反転させてみてください。

LINQのリンク