C#で配列を結合する方法!(Concat, Union)

C# C#

C#で配列を結合する方法について書いています。
配列の要素を結合する方法として、下記のメソッドを使うことが可能です。

・Array.Copy
・Concat(LINQ)
・Union(LINQ)

載せているコードについては、.Netのバージョン6(C#のバージョン10)で確認しました。

Array.Copyで配列を結合する

Array.Copyメソッドを使うことで、配列の内容を結合することが可能です。
例えば、下記のように使います。

var fruits1  = new string[3] {"apple", "banana", "peach"};
var fruits2  = new string[2] {"lemon", "orange"};

var fruits = new string[fruits1.Length + fruits2.Length];
Array.Copy(fruits1, fruits, fruits1.Length);
Array.Copy(fruits2, 0, fruits, fruits1.Length, fruits2.Length);

foreach(string fruit in fruits) {
    Console.WriteLine(fruit);
}

最初に3つの文字列を入れたfruits1配列を作成しました。
次に2つの文字列を入れたfruits2配列を作成しました。

その後にfruits1とfruits2配列のサイズを足して、fruits配列を作成しています。
fruits配列は初期化せずに、配列を用意しているだけです。
このfruits配列に、fruits1・fruits2配列を結合して格納します。

fruits配列の定義後にArray.Copyメソッドを使っています。
最初に指定している引数の意味は下記になります。

・第1引数:コピー元の配列
・第2引数:コピー先の配列
・第3引数:コピーする要素の数

公式ドキュメントでは、この辺りに記載があります。

今回は第1引数にfruits1配列を指定しています。
第2引数にコピー先のfruits配列を指定し、第3引数にfruits1配列の長さを指定しています。
これで、fruits配列にfruits1配列の内容がコピーされます。

次は同じArray.Copyメソッドを使っていますが、引数が5つになっています。
それぞれ、下記の意味になります。

・第1引数:コピー元の配列
・第2引数:コピー元からコピーする要素の開始位置
・第3引数:コピー先の配列
・第4引数:コピー先の格納を開始する要素の位置
・第5引数:コピー元からコピーする要素数

公式ドキュメントでは、この辺りに記載があります。

今回の場合だと、fruits2配列をコピー元の配列としていて、fruits配列の途中から要素をコピーしていることになります。
これで、fruits1・fruits2配列の内容をコピーした、fruits配列ができました。
このように配列の内容をコピーして、2つの配列を結合した内容の配列を作成することができます。

動作確認

今回のプログラムを実際に動かしてみると、下記のような結果になります。

apple
banana
peach
lemon
orange

2つのそれぞれの配列の要素が、全て出力されました。
配列が結合されて、ひとつになっていることが確認できました。

Concat(LINQ)で配列を結合する

LINQのConcatメソッドを使うことで、もっと簡単に結合することが可能です。
公式ドキュメントでは、この辺りに記載があります。

先ほどのプログラムを少し修正して、下記のように変えました。

var fruits1  = new string[3] {"apple", "banana", "peach"};
var fruits2  = new string[2] {"lemon", "orange"};

var fruits = fruits1.Concat(fruits2).ToArray();
foreach(string fruit in fruits) {
    Console.WriteLine(fruit);
}

先ほどと同様に、3つの文字列を入れたfruits1配列を作成しました。
次に2つの文字列を入れたfruits2配列を作成しました。

fruits1からConcatメソッドを使っています。
渡しているのは結合したい配列のfruits2です。
ToArrayメソッドを呼ぶことで、配列に変換して返しています。

結合された内容が返ってくるので、fruits変数で受け取っています。
これで、2つの配列を結合した内容がfruits変数に入っていることになります。

動作確認

作成したプログラムを動かすと、下記のように動作します。
2つの配列が結合されているのが確認できました。

apple
banana
peach
lemon
orange

Union(LINQ)で配列を結合する

LINQのUnionメソッドを使うことでも、簡単に結合することが可能です。
公式ドキュメントでは、この辺りに記載があります。

先ほどのプログラムのConcatメソッドをUnionメソッドに変えてみました。

var fruits1  = new string[3] {"apple", "banana", "peach"};
var fruits2  = new string[2] {"lemon", "orange"};

var fruits = fruits1.Union(fruits2).ToArray();
foreach(string fruit in fruits) {
    Console.WriteLine(fruit);
}

ConcatメソッドをUnionメソッドに変えただけですが、先ほどと同じように配列の内容が結合されます。
出力すると、同じように結合されていることが確認できます。

ConcatとUnionの違いは?

それでは、ConcatメソッドとUnionメソッドの何が違うのかというと、重複データを許すかどうかになります。
Concatメソッドでは重複を許しますが、Unionメソッドの方では重複を許しません。

例えば、下記のようなプログラムで挙動を確認できます。

var fruits1  = new string[4] {"apple", "banana", "peach", "lemon"};
var fruits2  = new string[4] {"lemon", "orange", "banana", "apple"};

var concatFruits = fruits1.Concat(fruits2).ToArray();
var unionFruits = fruits1.Union(fruits2).ToArray();

Console.WriteLine("---- concat fruits ----");
foreach(string fruit in concatFruits) {
    Console.WriteLine(fruit);
}

Console.WriteLine("---- union fruits ----");
foreach(string fruit in unionFruits) {
    Console.WriteLine(fruit);
}

fruits1とfruits2の配列をそれぞれ用意しました。
apple・banana・lemonが重複していますね。

その後にConcatメソッドで、結合した配列をconcatFruits変数に入れました。
次にUnionメソッドで、結合した配列をunionFruits変数に入れました。

そして、それぞれの配列の内容を表示するようにforeach文を書いています。
実際にプログラムを動作させると、結果は下記のようになります。

---- concat fruits ----
apple
banana
peach
lemon
lemon
orange
banana
apple
---- union fruits ----
apple
banana
peach
lemon
orange

確認すると、Concatメソッドで結合した場合には、全ての配列要素が含まれていることが確認できます。
一方でUnionメソッドでは、結合した配列の要素で重複されているものは省かれていることが確認できました。

おわりに

今回はC#で配列を結合する方法について書きました。
最初にArray.Copyメソッドを使って配列を結合しましたが、LINQのConcatメソッドやUnionメソッドを使った方が簡単に結合できました。

Concatメソッドでは、結合した配列の要素が重複しました。
反対にUnionメソッドでは、結合した配列の要素が重複しませんでした。

Array.Copyメソッドよりも、LINQのConcatメソッドやUnionメソッドの方が簡単に書けるので、どちらかを使うと良いかと思います。
どちらを使うかは要素を重複させたいかを判断して使うようにしましょう。

コメント

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