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

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

【C#,LINQ】Concat~配列やリストを他の配列やリストを合体したいとき~

 C#のLINQの関数であるConcat()の使い方についてです。
 配列やリストを、別の配列やリストと合体することができます。
f:id:urahimono:20180721063749p:plain


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

配列やリストを合体だ

 巨大な敵が現れた場合、あなたはどうしますか。
 当然のことながら、仲間たちと合体して巨大ロボになることが最適解ですよね。

 配列やリストを別の配列やリストと合体したいときは、LINQConcat()を使いましょう。

public static IEnumerable<TSource> Concat<TSource>( this IEnumerable<TSource> first, IEnumerable<TSource> second );
https://msdn.microsoft.com/ja-jp/library/bb302894.aspx

 使い方も簡単で、引数に合体したい配列やリストを指定するだけです。

Program.cs

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

public static class Program
{
    static void Main( string[] args )
    {
        // 数字データ
        int[] numbersA = new int[] { 0, 1, 2, 3, 4, 5, };
        int[] numbersB = new int[] { 9, 8, 7, 6, 5, 4, };

        // さあ、合体だ
        IEnumerable<int> concatAB   = numbersA.Concat( numbersB );
        IEnumerable<int> concatBA   = numbersB.Concat( numbersA );

        // 結果発表
        System.Console.WriteLine( "numbersA:{0}", numbersA.Text() );
        System.Console.WriteLine( "numbersB:{0}", numbersB.Text() );

        System.Console.WriteLine( "concatAB:{0}", concatAB.Text() );
        System.Console.WriteLine( "concatBA:{0}", concatBA.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

numbersA:[0], [1], [2], [3], [4], [5],
numbersB:[9], [8], [7], [6], [5], [4],
concatAB:[0], [1], [2], [3], [4], [5], [9], [8], [7], [6], [5], [4],
concatBA:[9], [8], [7], [6], [5], [4], [0], [1], [2], [3], [4], [5],

 見事二つの配列が合体して、巨大なシーケンスになりました。
 これで巨大な敵が街を襲ってきても対応できると思います。

配列とリストを合体できるのか

 先ほどは、同じ型の配列同士をConcat()を使って合体しました。
 では、同じ型の配列とListは合体できるのでしょうか。
 試してみましょう。

Program.cs

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

public static class Program
{
    static void Main( string[] args )
    {
        // 数字データ
        int[]       numbersA = new int[]     { 0, 1, 2, 3, 4, 5, };
        List<int>   numbersB = new List<int> { 9, 8, 7, 6, 5, 4, };

        // さあ、合体だ
        IEnumerable<int> concatAB   = numbersA.Concat( numbersB );
        IEnumerable<int> concatBA   = numbersB.Concat( numbersA );

        // 結果発表
        System.Console.WriteLine( "numbersA:{0}", numbersA.Text() );
        System.Console.WriteLine( "numbersB:{0}", numbersB.Text() );

        System.Console.WriteLine( "concatAB:{0}", concatAB.Text() );
        System.Console.WriteLine( "concatBA:{0}", concatBA.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

numbersA:[0], [1], [2], [3], [4], [5],
numbersB:[9], [8], [7], [6], [5], [4],
concatAB:[0], [1], [2], [3], [4], [5], [9], [8], [7], [6], [5], [4],
concatBA:[9], [8], [7], [6], [5], [4], [0], [1], [2], [3], [4], [5],

 この場合でも合体できることが確認できました。

 こんな感じでConcat()を七兆回ほど使って、合体させまくってみてください。

LINQのリンク