HOWTO · Csharp

C# の配列に文字列を追加する

C# の完全に満たされた配列に新しい要素を動的に追加する組み込みメソッドはありません。

このページの内容

C# の配列は長さが固定されているため、同じ配列にその場で要素を追加することはできません。値を追加するには、より大きな配列を作成するか、値をサイズ変更可能なコレクションにコピーします。値を繰り返し追加することが予想される場合は List<T> を使用し、結果が配列のままである必要がある場合の直接的な一度だけの増加には Array.Resize を使用します。例では文字列を使用していますが、追加する値が一致する型を持っていれば、どちらの方法も他の要素型で機能します。

配列を List<T> に変換して要素を追加する

既存の配列を List<T> に変換し、次に List<T>.Add を呼び出して新しい値をそのリストに追加します。C# では、List<T>.Add は項目を追加するためのリストメソッドであり、配列自体に対して呼び出すことはできません。後続のコードで配列が必要な場合にのみ、リストを元に戻します。List<T> は増加に合わせて容量を管理するため、複数の値を追加する場合に簡単な選択肢となります。変換では List<T> コンストラクタを直接使用します。LINQ は必要ありません。

この完全な例は、1 つの文字列を追加し、配列の結果を保持する方法を示しています。

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        string[] items = { "One", "Two", "Three" };
        string newItem = "New Element";

        var list = new List<string>(items);
        // List<T>.Add appends the new value to the list.
        list.Add(newItem);
        items = list.ToArray();

        foreach (string item in items)
        {
            Console.WriteLine(item);
        }
    }
}
One
Two
Three
New Element

new List<string>(items) は配列の値をリストにコピーします。List<T>.Add は newItem をそのリストに追加し、ToArray() はプログラムの残りの部分で使用される配列を作成します。後続のコードがリストで動作できる場合は、リストを保持し、最後の変換を省略します。

配列からリストへの変換は既存の要素をコピーし、リストは値が追加されるにつれて大きくなることができます。再変換すると別の配列が作成されるため、次の操作が List<string> を受け入れる場合はその手順を省略します。ジェネリック配列については、int[] に対する List<int> のように一致するリスト型を使用し、同じ型の値を追加します。

Array.Resize を使用して配列に要素を追加する

配列が必要な一度だけの追加については、配列を参照渡しで渡し、その新しい長さとともに Array.Resize を呼び出し、次に最後のインデックスに値を代入します。サイズ変更により代替配列が作成され、既存の値がそこにコピーされます。ref パラメーターにより、変数はその代替を参照するように更新されます。新しいスロットは、サイズ変更後に Length - 1 で使用できます。

この完全な例は、サイズ変更と代入の順序を示しています。

using System;

class Program
{
    static void Main()
    {
        string[] items = { "One", "Two", "Three" };
        string newItem = "New Element";

        Array.Resize(ref items, items.Length + 1);
        items[items.Length - 1] = newItem;

        foreach (string item in items)
        {
            Console.WriteLine(item);
        }
    }
}
One
Two
Three
New Element

呼び出し後、items はより大きな配列を参照するため、items.Length - 1 に代入すると新しく追加されたスロットが埋まります。これは一度だけの変更には簡単です。1 つずつ繰り返しサイズ変更すると、呼び出すたびに既存の値がコピーされるため、繰り返しの追加には代わりに List<T> を使用します。

Array.Resize は配列変数を ref で受け取るため、更新された参照は呼び出し後も items を通じて使用できます。要求する長さを追加で必要なスロットの数だけ増やし、次に各新しい値を対応するインデックスに代入します。追加する値が 1 つの場合、最後のインデックスは Length - 1 です。複数追加する場合は、サイズ変更した配列を他の場所で使用する前に、各新しいインデックスを埋めます。配列の要素型は、代入できる値を引き続き決定します。