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

【C#入門】Queue.Peekメソッドの使い方をサンプルコードでわかりやすく解説

C#のQueue.Peek()メソッドは、キュー(Queue)の先頭にあるオブジェクトを削除せずにそのまま返すためのメソッドです。「先頭の要素を確認したいだけ」という場面で活用できます。似たメソッドにDequeueがありますが、Dequeueは先頭要素を返したうえでキューから除去するのに対し、Peekは要素を残したまま参照できるのが特徴です。

構文

Peekメソッドの構文は以下のとおりです。

public virtual object Peek ();

注意点

キューが空の状態でPeekメソッドを呼び出すと、InvalidOperationExceptionがスローされるので注意してください。呼び出す前にCountプロパティで要素数をチェックしておくと安全です。

使用例1:非ジェネリックなQueueの場合

まずはSystem.Collections名前空間のQueueクラスを使った例を見てみましょう。

using System;
using System.Collections;
public class Demo {
   public static void Main() {
      Queue queue = new Queue();
      queue.Enqueue("AB");
      queue.Enqueue("BC");
      queue.Enqueue("CD");
      queue.Enqueue("DE");
      queue.Enqueue("EF");
      queue.Enqueue("FG");
      queue.Enqueue("GH");
      queue.Enqueue("HI");
      Console.WriteLine("Queue...");
      IEnumerator demoEnum = queue.GetEnumerator();
      while (demoEnum.MoveNext()) {
         Console.WriteLine(demoEnum.Current);
      }
      Console.WriteLine("Queue element at the beginning = "+queue.Peek());
      Console.WriteLine("Is Queue synchronized? = "+queue.IsSynchronized);
      Queue queue2 = Queue.Synchronized(queue);
      Console.WriteLine("Is Queue synchronized now? = "+queue2.IsSynchronized);
   }
}

実行結果

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

Queue...
AB
BC
CD
DE
EF
FG
GH
HI
Queue element at the beginning = AB
Is Queue synchronized? = False
Is Queue synchronized now? = True

この例では、Enqueueメソッドで8つの文字列を追加した後、Peekメソッドを呼び出しています。出力を見ると、最初に追加した「AB」が先頭要素として返されていることがわかります。また、Queue.Synchronizedメソッドを使うことで、スレッドセーフな同期ラッパーを作成できることも確認できます。

使用例2:ジェネリックなQueue<T>の場合

続いて、型安全なSystem.Collections.Generic名前空間のQueue<T>クラスを使った例です。

using System;
using System.Collections.Generic;
public class Demo {
   public static void Main() {
      Queue<string> queue = new Queue<string>();
      queue.Enqueue("Gary");
      queue.Enqueue("Jack");
      queue.Enqueue("Ryan");
      queue.Enqueue("Kevin");
      queue.Enqueue("Mark");
      queue.Enqueue("Jack");
      queue.Enqueue("Ryan");
      queue.Enqueue("Kevin");
      Console.Write("Count of elements = ");
      Console.WriteLine(queue.Count);
      Console.WriteLine("Queue element at the beginning = "+queue.Peek());
      Console.WriteLine("Does the queue has element Jack? = "+queue.Contains("Jack"));
      queue.Clear();
      Console.Write("Count of elements (updated) = ");
      Console.WriteLine(queue.Count);
   }
}

実行結果

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

Count of elements = 8
Queue element at the beginning = Gary
Does the queue has element Jack? = True
Count of elements (updated) = 0

この例では、まずCountプロパティで要素数「8」を確認し、Peekメソッドで先頭要素「Gary」を取得しています。Containsメソッドによる要素の存在チェックや、Clearメソッドによる全要素の削除後には要素数が「0」になっていることも確認できます。

まとめ

  • Queue.Peekメソッドは、キューの先頭要素を削除せずに取得する
  • キューが空の場合はInvalidOperationExceptionがスローされる
  • 要素も一緒に取り除きたい場合はDequeueメソッドを使用する
  • 型安全性を高めたい場合は、非ジェネリックなQueueではなくQueue<T>の利用を推奨
  1. C#のAggregateメソッドとは?配列要素を集計・演算する方法を解説

    C#のLINQに用意されているAggregate(集計)メソッドを使うと、Sum(合計)、Min(最小値)、Max(最大値)、Average(平均)といった数学的な演算を柔軟に実装できます。Aggregateメソッドは、ラムダ式で指定した処理をシーケンスの各要素に順番に適用し、最終的に1つの結果へと集約します。ここでは、配列の全要素を掛け合わせる例を通して、その使い方を見ていきましょう。サンプル:配列要素の積を求めるまずは、次のような整数型の配列を用意します。int[] arr = { 10, 15, 20 };この配列に対して、Aggregate()メソッドを次のように呼び出します。 x *

  2. JavaのQueueインターフェースにおけるpeek()・poll()・remove()メソッドの違いを徹底解説

    JavaのQueue(キュー)インターフェースは、処理を行う前にデータを一時的に保持することを目的としたコレクションです。キューはFIFO(First-In-First-Out:先入れ先出し)方式で動作し、最初に追加された要素が最初に取り出されます。Queueインターフェースには先頭要素を取得するためのメソッドが複数用意されており、それぞれ挙動が異なります。本記事では、peek()、poll()、remove()の3つのメソッドの違いを、サンプルコードと実行結果を交えて詳しく解説します。peek()メソッドpeek()メソッドは、キューの先頭にある要素を削除せずに返します。キューの状態は変化し