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

C#でLinkedListを反復処理する列挙子を取得する方法


C#のLinkedList<T>を反復処理するための列挙子(Enumerator)を取得するには、GetEnumerator()メソッドを使用します。この記事では、実際のコード例と出力結果をもとに、列挙子による要素の走査方法をわかりやすく解説します。

GetEnumeratorメソッドとは

GetEnumerator()は、リスト内の各ノードを先頭から末尾へ順番に訪問できる列挙子を返すメソッドです。戻り値の型はLinkedList<T>.Enumeratorで、主に以下のメンバーを利用します。

  • MoveNext() … 次の要素へ進みます。次の要素が存在すればtrue、存在しなければfalseを返します。
  • Current … 現在位置にある要素を取得します。

例1:列挙子を使ってLinkedListを反復処理する

まずは、列挙子を直接操作してすべての要素を出力する基本的な例を見てみましょう。

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("D");
      list.AddLast("E");
      list.AddLast("F");
      list.AddLast("G");
      list.AddLast("H");
      list.AddLast("I");
      list.AddLast("J");

      Console.WriteLine("Count of nodes = " + list.Count);
      Console.WriteLine("Elements in LinkedList... (Enumerator iterating through LinkedList)");

      LinkedList<string>.Enumerator demoEnum = list.GetEnumerator();
      while (demoEnum.MoveNext()) {
         string res = demoEnum.Current;
         Console.WriteLine(res);
      }
   }
}

出力結果

上記のコードを実行すると、次のような出力が得られます。

Count of nodes = 10
Elements in LinkedList... (Enumerator iterating through LinkedList)
A
B
C
D
E
F
G
H
I
J

MoveNext()がfalseを返すまでwhileループが繰り返され、各ノードの値がCurrentプロパティ経由で順番に出力されていることがわかります。

例2:foreachループとの比較

次に、通常のforeachループと明示的な列挙子の両方を使った例を紹介します。foreachは内部的にGetEnumerator()を呼び出しているため、両者は本質的に同じ仕組みで動作しています。

using System;
using System.Collections.Generic;

public class Demo {
   public static void Main(String[] args){
      LinkedList<string> list1 = new LinkedList<string>();
      list1.AddLast("One");
      list1.AddLast("Two");
      list1.AddLast("Three");
      list1.AddLast("Four");
      list1.AddLast("Five");

      Console.WriteLine("Elements in LinkedList1...");
      foreach (string res in list1){
         Console.WriteLine(res);
      }

      LinkedList<string> list2 = new LinkedList<string>();
      list2.AddLast("India");
      list2.AddLast("US");
      list2.AddLast("UK");
      list2.AddLast("Canada");
      list2.AddLast("Poland");
      list2.AddLast("Netherlands");

      Console.WriteLine("Elements in LinkedList2... (Enumerator iterating through LinkedList2)");
      LinkedList<string>.Enumerator demoEnum = list2.GetEnumerator();
      while (demoEnum.MoveNext()) {
         string res = demoEnum.Current;
         Console.WriteLine(res);
      }

      LinkedList<string> list3 = new LinkedList<string>();
      list3 = list2;
      Console.WriteLine("Is LinkedList3 equal to LinkedList2? = "+list3.Equals(list2));
   }
}

出力結果

このコードを実行すると、以下の出力が得られます。

Elements in LinkedList1...
One
Two
Three
Four
Five
Elements in LinkedList2... (Enumerator iterating through LinkedList2)
India
US
UK
Canada
Poland
Netherlands
Is LinkedList3 equal to LinkedList2? = True

まとめ

  • LinkedList<T>の反復処理にはGetEnumerator()で列挙子を取得し、MoveNext()Currentを組み合わせて使います。
  • シンプルな全件走査であればforeachループの方が簡潔に書けます。
  • 列挙子を明示的に扱うと、走査のタイミングを細かく制御できるのがメリットです。

  1. C#のLinkedList.AddLast()メソッドの使い方を徹底解説

    C#のLinkedList.AddLast()メソッドとはC#のLinkedList<T>クラスには、連結リストの末尾に新しいノードを追加するためのAddLast()メソッドが用意されています。リストの最後に要素を加えたい場合に非常に便利なメソッドです。基本的な使い方まず、文字列型の配列を宣言します。string[] students = {Jenifer, Angelina, Vera};次に、この配列をもとにLinkedListを生成します。LinkedList<string> list = new LinkedList<string>(students

  2. C#でLinkedListを走査する方法 ― 宣言からトラバーサルまで

    C#では、System.Collections.Generic名前空間に含まれるLinkedListコレクションを使用することで、連結リストを簡単に扱うことができます。まずはLinkedListを宣言する方法から見ていきましょう。var a = new LinkedList<string>();次に、AddLastメソッドを使ってリストの末尾に要素を追加します。a.AddLast(Tim); a.AddLast(Tom);LinkedListの走査(トラバーサル)は、foreachループを使うことで非常にシンプルに実現できます。以下に完全なサンプルコードを示します。サンプルコードu