C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#のLinkedListから指定した値の最初の出現を削除する方法

C#のLinkedList<T>クラスには、指定した値に一致する最初のノードだけを削除できるRemoveメソッドが用意されています。リスト内に同じ値が複数存在する場合でも、先頭側から検索して見つかった1件のみが削除され、それ以降の同じ値はすべてそのまま保持されます。この記事では、実際のコード例と実行結果をもとに、その動作をわかりやすく解説します。

ポイント:Removeメソッドの動作

  • Remove(T value)は、リストの先頭から順に値を比較し、最初に一致したノードのみを削除します。
  • 削除に成功した場合はtrue、該当する値が存在しない場合はfalseを返します。
  • 線形検索を行うため、計算量はO(n)です。

例1:文字列「A」の最初の出現を削除する

次のサンプルでは、「A」が4つ含まれるLinkedListを作成し、Remove("A")を呼び出して最初の1件だけを削除しています。

using System;
using System.Collections.Generic;

public class Demo {
   public static void Main(){
      LinkedList<string> list = new LinkedList<string>();
      list.AddLast("A");
      list.AddLast("B");
      list.AddLast("C");
      list.AddLast("A");
      list.AddLast("E");
      list.AddLast("F");
      list.AddLast("A");
      list.AddLast("H");
      list.AddLast("A");
      list.AddLast("j");

      Console.WriteLine("ノード数 = " + list.Count);
      Console.WriteLine("LinkedListの要素(列挙子による反復処理)...");
      LinkedList<string>.Enumerator demoEnum = list.GetEnumerator();
      while (demoEnum.MoveNext()) {
         string res = demoEnum.Current;
         Console.WriteLine(res);
      }

      // 値「A」の最初の出現のみを削除
      list.Remove("A");

      Console.WriteLine("ノード数 = " + list.Count);
      Console.WriteLine("LinkedListの要素(列挙子による反復処理)...");
      demoEnum = list.GetEnumerator();
      while (demoEnum.MoveNext()) {
         string res = demoEnum.Current;
         Console.WriteLine(res);
      }
   }
}

実行結果

ノード数 = 10
LinkedListの要素(列挙子による反復処理)...
A
B
C
A
E
F
A
H
A
j
ノード数 = 9
LinkedListの要素(列挙子による反復処理)...
B
C
A
E
F
A
H
A
j

実行結果を見ると、ノード数が10から9に減り、先頭にあった「A」だけが削除されていることが確認できます。残りの3つの「A」は影響を受けていません。

例2:重複する値「Three」の最初の出現を削除する

続いて、同じ値が連続して含まれるケースを見てみましょう。「Three」が3つあるリストから、最初の1件のみを削除します。

using System;
using System.Collections.Generic;

public class Demo {
   public static void Main(){
      LinkedList<string> list = new LinkedList<string>();
      list.AddLast("One");
      list.AddLast("Two");
      list.AddLast("Three");
      list.AddLast("Three");
      list.AddLast("Three");
      list.AddLast("Four");

      Console.WriteLine("ノード数 = " + list.Count);
      Console.WriteLine("LinkedListの要素(列挙子による反復処理)...");
      LinkedList<string>.Enumerator demoEnum = list.GetEnumerator();
      while (demoEnum.MoveNext()) {
         string res = demoEnum.Current;
         Console.WriteLine(res);
      }

      // 値「Three」の最初の出現のみを削除
      list.Remove("Three");

      Console.WriteLine("ノード数 = " + list.Count);
      Console.WriteLine("LinkedListの要素(列挙子による反復処理)...");
      demoEnum = list.GetEnumerator();
      while (demoEnum.MoveNext()) {
         string res = demoEnum.Current;
         Console.WriteLine(res);
      }
   }
}

実行結果

ノード数 = 6
LinkedListの要素(列挙子による反復処理)...
One
Two
Three
Three
Three
Four
ノード数 = 5
LinkedListの要素(列挙子による反復処理)...
One
Two
Three
Three
Four

このように、Remove("Three")を呼び出すと、先頭から見て最初の「Three」だけが削除され、残りの2つの「Three」はそのまま残ります。ノード数も6から5に減少しています。

まとめ

C#のLinkedListで特定の値を削除したい場合は、Removeメソッドを使います。このメソッドは常に最初に一致した要素のみを削除するため、重複する値を持つリストを扱う際には、この仕様を理解しておくことが重要です。すべての一致要素を削除したい場合は、whileループでRemovetrueを返す限り繰り返し呼び出すなどの対応が必要になります。

  1. Pythonでタプルから文字列要素を削除する方法

    Pythonでタプルの中から文字列を削除したい場合、「リスト内包表記」と「type関数」を組み合わせることで簡単に実現できます。まず前提として、リストは異なる型の値(整数、浮動小数点数、文字列など、あらゆるデータ型)を混在させて格納できる柔軟なデータ構造です。また「タプルのリスト」とは、リストの中に複数のタプルが格納された構造のことを指します。リスト内包表記は、リストを反復処理しながら各要素に対して操作を行うための簡潔な記法です。ループ処理を1行で書けるため、コードの可読性と効率が向上します。type関数は、引数として渡されたオブジェクトのクラス(データ型)を返す組み込み関数です。これを使うこ

  2. Pythonでタプルのリストから重複要素を削除する方法

    Pythonでタプルのリストから重複する要素を削除したい場合、リスト内包表記とset(集合)を組み合わせるのが簡単で効果的な方法です。まず前提として、リストは整数・浮動小数点数・文字列など、異なるデータ型の値を混在させて格納できる柔軟なデータ構造です。また、「タプルのリスト」とは、リストの中に複数のタプルが格納されたデータ構造のことを指します。リスト内包表記は、リストを反復処理しながら操作を行うための簡潔な記法であり、コードを短く読みやすくできるのが特徴です。サンプルコードmy_list_1 = [(11, 14), (0, 78), (33, 11), (0, 78)] print(The