C#で配列の要素を削除する方法!(LINQやリスト変換で削除など)

C# C#

C#の配列の要素を削除する方法について書いています。
載せているコードについては、.Netのバージョン6(C#のバージョン10)で確認しました。

配列の要素を削除する

C#の配列は要素数を指定して定義します。
そのため配列は固定サイズで、作った後に配列の要素数を簡単に削除することはできません。

本当に配列のサイズを変更する必要があるのでしょうか。
このように、使用しない配列要素に空文字や0などの既定値を設定するようにして、処理するという方法もあるかと思います。

var fruits = new string[3] {"orange", "banana", "grape"};
fruits[1] = "";

foreach(string fruit in fruits) {
    if (fruit != "") {
        Console.WriteLine(fruit); // orange grape
    }
}
Console.WriteLine(fruits.Length); // 3

文字列の3つの要素を初期値で入れて、fruits配列を作成しました。
配列の1番目「banana」の位置に空文字(“”)を入れました。(空文字の場合は削除とみなします。。)

foreach文でループさせるときに、配列が空文字でなかったら出力するようにしました。
これで、「orange」と「grape」のみ出力されます。
このように、この値なら削除されたというようにして、処理することもできるかと思います。

最後にLengthプロパティにアクセスすると、3になっています。
配列のサイズは変わりません。

配列の要素を全て削除する

ArrayクラスのClearメソッドを呼び出して、配列を渡すことで、すべての要素を空(既定値)にします。
string配列の場合は、nullが入って、int配列の場合は0が設定されます。

var fruits = new string[3] {"orange", "banana", "grape"};
Array.Clear(fruits);

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

上記は、先ほどと同じように、3つの文字列を要素に配列を作成しています。
その次にArray.Clearで要素を空(規定値)に設定しています。

配列のすべての要素にnullが設定されます。
foreach文で確認すると、空の出力が3回行われました。
fruit != null」というif文を追加すると、防ぐことが可能です。

下記は、数値を要素にした例になります。

var numbers = new int[3] {10, 20, 30};
Array.Clear(numbers);

foreach(int number in numbers) {
    Console.WriteLine(number);
}

3つの要素のnumbers配列を作成しました。
その次にArray.Clearを使って、クリア処理をしています。

配列の要素にはすべて「0」が設定されます。
foreach文で出力すると、「0」が3回出力されました。

文字列でも、数値配列でも、先ほどと同様に配列のサイズは変わりません。
繰り返しになりますが、この処理では既定値が設定されただけです。

Array.Clearメソッドについて、詳しくは公式のこちらのドキュメントに記載があります。

配列の要素を削除する(サイズ変更)

LINQを使って、配列のサイズも変更しつつ削除することができます。
例えば、このように使うことができます。

var drinks = new string[3] {"water", "beer", "cola"};
drinks = drinks.Where(value => value != "beer").ToArray();

foreach (string drink in drinks) {
    Console.WriteLine(drink);
}
Console.WriteLine(drinks.Length); // 2

3つの文字列を格納したdrinks配列を作成しました。
次の行でLINQを使って、配列の要素が「beer」じゃないものだけ、drinks配列に格納しなおしています。

foreach文でループして確認すると、「water」と「cola」だけが出力されます。
Lengthプロパティにアクセスすると、配列のサイズも「2」になっています。

配列をListに変換して削除する

配列をListに変換して、要素を削除することもできます。
例えば、このように使います。

var drinks = new string[4] {"water", "beer", "cola", "wine"};
var drinkList = new List<string>();

drinkList = drinks.ToList();
drinkList.RemoveAt(2);

foreach (string drinkItem in drinkList) {
    Console.WriteLine(drinkItem);
}
Console.WriteLine(drinkList.Count);

4つの文字列を格納したdrinks配列を作成しました。
次の行で、文字列のListのdrinkListを作成しています。

drinks配列からToListメソッドを呼ぶことで、Listに変換できます。
drinks配列をListに変換した後に、作成したdrinkListに格納しています。
その次の行で「drinkList.RemoveAt(2)」とすることにより、リストの2番目の要素(cola)を削除します。

foreach文でループして確認すると、「water・beer・wine」が出力されます。
drinkListの要素数は、Countプロパティで確認することができます。
確認すると「cola」の要素が減ったので、「3」が返ってきました。

おわりに

今回はC#で配列の要素を削除する方法について書きました。
LINQやListを使うと、配列のサイズも変えることが可能でしたが、動的にサイズ変更する場合には最初からListを使っていた方がいいような気がします。
固定サイズで処理できる場合のみ、配列を使っていくと良いのではないでしょうか。

コメント

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