C#のキューを試してみた

キューは、オブジェクト(データ)を先入れ先出しするコレクションです。コレクションに入れた順番で取り出せるということですね。

目次

  1. Queueクラス
    1. Countプロパティ
    2. Enqueue()メソッド
    3. Dequeue()メソッド
    4. Peek()メソッド
    5. Last()メソッド
    6. Clear()メソッド
  2. 試してみた
    1. ビュー
    2. コード
    3. 動かしてみた

Queueクラス

ここではジェネリックの Queue(T)クラス を扱います。

キュー特有のプロパティやメソッドがあります。

Countプロパティ

キューの中のオブジェクトの数を返します。

Enqueue()メソッド

キューにオブジェクトを追加します。キューでは、オブジェクトを追加した順番が保持されます。

Dequeue()メソッド

キューの一番古いオブジェクトを取り出します。取り出されたオブジェクトは、キューから無くなります。

Peek()メソッド

キューの一番古いオブジェクトを参照します。Dequeueメソッドと違って、オブジェクトはキューから削除されません。

一番古いオブジェクトを「見る」という感じです。

Last()メソッド

キューの一番新しいオブジェクトを参照します。オブジェクトはキューから削除されません。

一番新しいオブジェクトを「見る」という感じです。

Clear()メソッド

キューから全てのオブジェクトを削除します。

試してみた

キューを試すプログラムを作ってみました。

キューの内容と操作結果を表示するだけのプログラムです。

ビュー

キューの表示用のテキストブロック、入力用のテキストボックス、操作結果の表示用のテキストブロックと、各操作用のボタンを並べただけのものです。

<Window x:Class="trial_queue.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:trial_queue"
        mc:Ignorable="d"
        Title="MainWindow" Height="200" Width="300">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="1*" />
            <ColumnDefinition Width="80" />
        </Grid.ColumnDefinitions>
        <TextBlock Name="textblock" Grid.Column="0" Margin="5" />
        <StackPanel Grid.Column="1">
            <TextBox Name="textbox" Margin="5" />
            <Button Name="buttonEnqueue" Content="Enqueue" Click="buttonEnqueue_Click" />
            <Button Name="buttonDequeue" Content="Dequeue" Click="buttonDequeue_Click" />
            <TextBlock Name="textblockDequeue" />
            <Button Name="buttonPeek" Content="Peek" Click="buttonPeek_Click" />
            <TextBlock Name="textblockPeek" />
            <Button Name="buttonLast" Content="Last" Click="buttonLast_Click" />
            <TextBlock Name="textblockLast" />
        </StackPanel>
    </Grid>
</Window>

コード

using System.Collections.Generic;
using System.Linq;
using System.Windows;

namespace trial_queue
{
    public partial class MainWindow : Window
    {
        Queue<string> qu = new Queue<string>();

        public void UpdateDisplay() // キューの表示を最新状態にする
        {
            textblock.Text = string.Empty;
            string[] ar = new string[qu.Count];
            qu.CopyTo(ar, 0);
            foreach(string s in ar)
            {
                textblock.Text = textblock.Text + s + "\r\n";
            }
        }

        public MainWindow()
        {
            InitializeComponent();

        }

        private void buttonEnqueue_Click(object sender, RoutedEventArgs e)
        {
            if(textbox.Text.Length > 0)
            {
                qu.Enqueue(textbox.Text); // キューに追加
                UpdateDisplay();
            }
        }

        private void buttonDequeue_Click(object sender, RoutedEventArgs e)
        {
            if (qu.Count > 0)
            {
                textblockDequeue.Text = qu.Dequeue(); // キューから取り出し
                UpdateDisplay();
            }
        }

        private void buttonPeek_Click(object sender, RoutedEventArgs e)
        {
            if (qu.Count > 0)
            {
                textblockPeek.Text = qu.Peek(); // 一番古いオブジェクトを参照
                UpdateDisplay();
            }
        }

        private void buttonLast_Click(object sender, RoutedEventArgs e)
        {
            if (qu.Count > 0)
            {
                textblockLast.Text = qu.Last(); // 一番新しいオブジェクトを参照
                UpdateDisplay();
            }
        }
    }
}

特に難しいことはしていません。

ボタンを押すたびにキューの表示用テキストブロックのTextプロパティを書き換えます。このあたりはバインディングを上手く使えばスマートだと思いますが、上手くないので。

動かしてみた

動かしてみました。

実行結果

“123”、”abc”、”あいう”、”ABC”と順番に入力して、Dequeue→Peek→Lastの順番でボタンを押した状態です。

公開日

広告