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

C#のStack.ToArray()メソッドとは?使い方をサンプルコード付きで解説


C#のStack.ToArray()メソッドとは

C#におけるStack.ToArray()メソッドは、System.Collections名前空間のStackクラスに用意されているメソッドで、スタックの全要素を新しい配列(object型の1次元配列)にコピーするために使用します。元のスタック自体は変更されず、配列の要素順序はスタックと同じく、最後に追加された要素が先頭に来る点が特徴です。

構文

Stack.ToArray()メソッドの構文は以下のとおりです。

public virtual object[] ToArray ();

引数は不要で、戻り値としてスタックの要素のコピーを格納したobject[]型の配列が返されます。

サンプルコード①:文字列のスタックを配列へコピーする

それでは、実際の使用例を見てみましょう。この例では、文字列を格納したスタックを作成し、Stack.Synchronized()で生成した同期化ラッパー経由でToArray()メソッドを呼び出しています。

using System;
using System.Collections;
public class Demo {
    public static void Main() {
        Stack stack = new Stack();
        stack.Push("Inspiron");
        stack.Push("Alienware");
        stack.Push("Projectors");
        stack.Push("Monitors");
        stack.Push("XPS");
        stack.Push("Laptop");
        stack.Push("Notebook");
        Console.WriteLine("Stack elements...");
        foreach(string val in stack) {
            Console.WriteLine(val);
        }
        Console.WriteLine("Count of elements = "+stack.Count);
        stack.Push("Ultrabook");
        stack.Push("Cameras");
        stack.Push("Keyboards");
        Console.WriteLine("\nStack elements...updated");
        foreach(string val in stack) {
            Console.WriteLine(val);
        }
        Console.WriteLine("\nCount of elements (updated) = "+stack.Count);
        Console.WriteLine("Is the Stack synchronized? = "+stack.IsSynchronized);
        Stack stack2 = Stack.Synchronized(stack);
        Console.WriteLine("Is the Stack synchronized? = "+stack2.IsSynchronized);
        Console.WriteLine("\nCopying the Stack to a new array...");
        Object[] objArr = stack2.ToArray();
        foreach(Object ob in objArr) {
            Console.WriteLine(ob);
        }
    }
}

このプログラムを実行すると、次のような出力が得られます。

Stack elements...
Notebook
Laptop
XPS
Monitors
Projectors
Alienware
Inspiron
Count of elements = 7
Stack elements...updated
Keyboards
Cameras
Ultrabook
Notebook
Laptop
XPS
Monitors
Projectors
Alienware
Inspiron
Count of elements (updated) = 10
Is the Stack synchronized? = False
Is the Stack synchronized? = True
Copying the Stack to a new array...
Keyboards
Cameras
Ultrabook
Notebook
Laptop
XPS
Monitors
Projectors
Alienware
Inspiron

実行結果のポイント

  • スタックはLIFO(Last-In-First-Out:後入れ先出し)構造のため、要素は最後にPushしたものから順に表示されます。
  • 元のスタックのIsSynchronizedはFalseですが、Stack.Synchronized()で作成したラッパーはスレッドセーフであり、Trueが返されます。
  • ToArray()メソッドで取得した配列にも、スタックと同じ順序で要素がコピーされていることが確認できます。

サンプルコード②:数値のスタックを配列へコピーする

続いて、整数値を格納したスタックを配列にコピーする例を見てみましょう。

using System;
using System.Collections;
public class Demo {
    public static void Main() {
        Stack stack = new Stack();
        stack.Push(150);
        stack.Push(300);
        stack.Push(500);
        stack.Push(750);
        stack.Push(1000);
        stack.Push(1250);
        stack.Push(1500);
        stack.Push(2000);
        stack.Push(2500);
        Console.WriteLine("Stack elements...");
        foreach(int val in stack) {
            Console.WriteLine(val);
        }
        Console.WriteLine("Count of elements = "+stack.Count);
        stack.Push(3000);
        stack.Push(3500);
        stack.Push(4000);
        Console.WriteLine("\nStack elements...updated");
        foreach(int val in stack) {
            Console.WriteLine(val);
        }
        Console.WriteLine("\nCount of elements (updated) = "+stack.Count);
        Console.WriteLine("\nCopying the Stack to a new array...");
        Object[] objArr = stack.ToArray();
        foreach(Object ob in objArr) {
            Console.WriteLine(ob);
        }
        Console.WriteLine("\nCount of elements in array = "+objArr.Length);
    }
}

このプログラムを実行すると、次のような出力が得られます。

Stack elements...
2500
2000
1500
1250
1000
750
500
300
150
Count of elements = 9
Stack elements...updated
4000
3500
3000
2500
2000
1500
1250
1000
750
500
300
150
Count of elements (updated) = 12
Copying the Stack to a new array...
4000
3500
3000
2500
2000
1500
1250
1000
750
500
300
150
Count of elements in array = 12

実行結果のポイント

  • 合計12個の要素をPushした後にToArray()メソッドを呼び出すと、配列の長さ(Length)も12となり、すべての要素が正しくコピーされていることがわかります。
  • コピー後も元のスタックはそのまま利用できるため、用途に応じて配列とスタックを使い分けることが可能です。

まとめ

Stack.ToArray()メソッドを使えば、スタックの内容を簡単にobject型の配列へ複製できます。LIFO構造の特性上、配列の先頭には最後に追加した要素が格納される点に注意しましょう。スタックのデータをforeachループで処理したり、配列を前提とした他のAPIに渡したりしたい場合などに役立つ便利なメソッドです。

  1. C#のStackクラスとは?使い方と基本操作をわかりやすく解説

    C#のStackクラスは、要素を「後入れ先出し(LIFO:Last-In, First-Out)」の形式で管理するためのコレクションです。最後に追加した要素が最初に取り出されるという特性を持つため、履歴管理や元に戻す(Undo)処理など、特定の順序でデータを扱いたい場面で活用されます。 Stackの基本操作:Push と Pop Stackでは、要素を追加することを「プッシュ(Push)」、要素を取り出すことを「ポップ(Pop)」と呼びます。 Push:スタックの一番上に新しい要素を追加する Pop:スタックの一番上から要素を取り出して削除する Stackクラスの使用例 まず、Stackに

  2. C#のStackクラスを徹底解説!PushとPopの使い方とサンプルコード

    C#のStackクラスは、LIFO(Last-In, First-Out:後入れ先出し)方式でオブジェクトを管理するコレクションです。最後に追加した要素から順に取り出したい場合に活用されます。 Stackクラスには、以下のような便利なプロパティが用意されています。 Count … スタック内に格納されている要素数を取得します。 Push操作:スタックへの要素追加 Pushメソッドを使うと、スタックの先頭(一番上)に新しい要素を追加できます。 Stack st = new Stack(); st.Push(A); st.Push(B); st.Push(C); st.Push(D); この