うら干物書き

ゲームを作りたい!

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