C#で配列を結合する5つの方法|実用サンプル付き

C#を使っていると、複数の配列を一つにまとめたいという場面がよくあります。たとえば、データの一覧を統合したいときや、条件別に分けられた配列をひとまとめにしたいときです。しかし、C#の配列はサイズが固定であるため、JavaScriptやPythonのように簡単には結合できないという点に注意が必要です。

本記事では、C#で配列を結合するための代表的な方法を5つ紹介し、それぞれのメリットや注意点も解説します。初心者の方でも理解しやすいよう、具体的なコード例とともに解説していきます。


Array.Copyを使って結合する方法

もっとも基本的な方法は、Array.Copyを使って結合する方法です。これにより、元の配列の要素を新しい配列に順番にコピーすることができます。

int[] array1 = { 1, 2, 3 };
int[] array2 = { 4, 5, 6 };

int[] result = new int[array1.Length + array2.Length];

Array.Copy(array1, 0, result, 0, array1.Length);
Array.Copy(array2, 0, result, array1.Length, array2.Length);

Console.WriteLine(string.Join(", ", result));
// 出力: 1, 2, 3, 4, 5, 6

この方法は、明示的に新しい配列を作成し、手動でコピーするため、配列のサイズが事前にわかっている場合に適しています。


Concatメソッドを使って結合する方法(LINQ)

LINQを使うと、Concatメソッドで簡潔に配列を結合できます。これは可読性が高く、コードがすっきりする利点があります。

using System;
using System.Linq;

int[] array1 = { 1, 2, 3 };
int[] array2 = { 4, 5, 6 };

int[] result = array1.Concat(array2).ToArray();

Console.WriteLine(string.Join(", ", result));
// 出力: 1, 2, 3, 4, 5, 6

ただし、.ToArray()を忘れると、結合後も IEnumerable<int> のままとなってしまう点に注意が必要です。


List<T>に変換して結合する方法

可変長で扱いたい場合は、List<T>を使う方法も便利です。あとから要素を追加したり、結合したりするのが容易です。

List<int> list = new List<int>(array1);
list.AddRange(array2);

int[] result = list.ToArray();

Console.WriteLine(string.Join(", ", result));
// 出力: 1, 2, 3, 4, 5, 6

この方法は、配列のサイズが不確定であったり、繰り返し結合を行う場合に最適です。


Buffer.BlockCopyを使った高速な結合方法

大量のデータを高速に結合したい場合は、Buffer.BlockCopyが使えます。ただし、この方法は型がbyte[]などのプリミティブ型である必要があります。

byte[] array1 = { 1, 2, 3 };
byte[] array2 = { 4, 5, 6 };

byte[] result = new byte[array1.Length + array2.Length];

Buffer.BlockCopy(array1, 0, result, 0, array1.Length);
Buffer.BlockCopy(array2, 0, result, array1.Length, array2.Length);

Console.WriteLine(string.Join(", ", result));
// 出力: 1, 2, 3, 4, 5, 6

この方法は高速ですが、型の制約があるため、状況によって使い分ける必要があります。


自作関数で汎用的な結合メソッドを作る

複数の配列を結合する処理が頻繁に出てくる場合は、汎用的なメソッドを用意しておくと便利です。

public static T[] MergeArrays<T>(params T[][] arrays)
{
int length = arrays.Sum(arr => arr.Length);
T[] result = new T[length];

int offset = 0;
foreach (var array in arrays)
{
Array.Copy(array, 0, result, offset, array.Length);
offset += array.Length;
}

return result;
}

// 使用例
int[] a = { 1, 2 };
int[] b = { 3, 4 };
int[] c = { 5, 6 };

int[] merged = MergeArrays(a, b, c);
Console.WriteLine(string.Join(", ", merged));
// 出力: 1, 2, 3, 4, 5, 6

このようにすることで、何個でも配列を渡して結合できるので、拡張性の高い実装が可能です。


配列結合時の注意点とベストプラクティス

配列を結合する際には、以下のような点にも注意が必要です。

  • サイズの確保Array.Copyを使う場合は、結合後のサイズをあらかじめ計算しておく必要があります。
  • メモリ効率:頻繁な結合を行う場合は、配列よりもList<T>の利用を検討するとパフォーマンス面で有利です。
  • 型の制限Buffer.BlockCopyは汎用性が低いため、用途が限定されます。
  • 読みやすさと保守性:処理が簡単な場合はConcat、複雑になってきたら自作関数で統一するのがおすすめです。

まとめ

C#で配列を結合する方法は、用途や状況に応じてさまざまな選択肢があります。簡潔さを求めるならConcat、効率性を求めるならArray.CopyBuffer.BlockCopy、拡張性を重視するなら自作関数やList<T>の利用が有効です。

目的に応じた最適な方法を選び、実際の開発に活用してみてください。

タイトルとURLをコピーしました