うら干物書き

ゲームを作りたい!

【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のリンク