グループ化された複数選択リスト - Spectre Console シリーズ
Spectre Console は、.NET ライブラリで、プレーンな C# コンソールアプリケーションを視覚的にリッチでインタラクティブなツールに変換できます。 白黒の静的な画面の代わりに、色やレイアウト、インタラクティブな選択肢でユーザーを促すことができます。 この記事では、最も強力な入力機能の1つである複数選択プロンプトと、特に選択グループの使い方について説明します。
Tim Corey 氏のビデオ"Multi-Select Lists with Groupings - Spectre Console Series"のウォークスルーに従って、これを行います。 Timが説明し、コードを示し、実行するので、あなた自身のプロジェクトでこれを実装する方法を見ることができます。 以下の各見出しには、そのトピックが表示されるビデオのおおよその時間が記載されていますので、そのトピックに直接ジャンプすることができます。
複数選択プロンプトの紹介
ビデオの冒頭でティム・コリーは、Spectre Console を使えば"C# コンソールアプリを視覚的に魅力的で情報量の多いアプリケーションに変えることができる"(0:02)ことを視聴者に伝えます。 このシリーズでは、ライブラリを10分ずつに分けて紹介しています。 この動画では、複数選択プロンプト(0:18)を使って、ユーザーにリストまたは複数のリストから1つ以上の選択肢を選んでもらうことに焦点を当てています。
簡単な複数選択プロンプトを設定する
Timは、自分のコードにすでにある2つのリストを示すことから始めます:
List<string> usualNames = new() {
"Tim Corey",
"Sue Storm",
"Bilbo Baggins",
"John Doe",
"Princess Donut",
"Steve Rogers"
};
List<string> familyNames = new() {
"Charity",
"Jon",
"Chris"
};List<string> usualNames = new() {
"Tim Corey",
"Sue Storm",
"Bilbo Baggins",
"John Doe",
"Princess Donut",
"Steve Rogers"
};
List<string> familyNames = new() {
"Charity",
"Jon",
"Chris"
};(You can see these on screen at about 0:38.)
彼は、ユーザーが0個、1個、または多数の項目を選択する可能性があるため、favoriteNamesというList
Timは、各選択肢は文字列オブジェクトであり、プロンプトはユーザーが選択した選択肢の配列またはリストを返すことを強調している(1:20-1:26)。
次に、ユーザーをガイドするためのカスタムタイトルを追加します:
.Title("Which are your favorite placeholder names?").Title("Which are your favorite placeholder names?")これは、プロンプトのトップに明確なヘッダーを設定します(1:31-1:50)。
ユーザー ガイダンスのための説明テキストを追加する
ティムはタイトルだけで終わりません。 彼はまた、プロンプトの操作方法をユーザーに伝えるための説明テキストも追加している(1:50)。
彼は次のように書きます:
.InstructionsText("(Press <space> to toggle, <enter> to accept)").InstructionsText("(Press <space> to toggle, <enter> to accept)")Spectre Console はアクセントカラーのカスタマイズをサポートしているので、重要な部分を強調するために緑、青、黄色、灰色、または赤で指示を表示することができます。
重要なのは、ユーザーに伝えることです:項目を切り替えるにはスペースバーを押し、答えを受け入れるにはエンターキーを押してください (2:12)。 これにより、ユーザーにとって簡単なスクリプトになります。
選択肢の追加と結果の表示
次に、ティムは実際のデータを追加します。 最初は1つのリストでシンプルに。彼は .AddChoices(usualNames) を使っている(2:24-2:34)。
その後、彼は、ユーザーの選択をコンソールに出力するための、わかりやすいforeachループを書いています(2:38-2:52):
foreach (var name in favoriteNames)
{
Console.WriteLine(name);
}foreach (var name in favoriteNames)
{
Console.WriteLine(name);
}彼は書式を気にせず、複数選択プロンプトが機能することを示すだけだ(2:53-3:00)。
Timがターミナルでプログラムを実行する(3:00)。 プロンプトに名前のリストが表示されます。 彼はスペースバーを使って、"Tim Corey "や "Sue Storm "など、いくつかの項目を選び、Enterを押すと、コンソールが選んだ選択肢を出力する(3:07-3:15)。 これは、最も簡単な作業バージョンを示しています。

選択グループによる複数リストへの移動
基本的なセットアップがうまくいったところで、ティムは"もう少し面白く"する(3:22)。 1つのリストではなく、normalNamesとfamilyNamesの2つのリストを持っています。
彼は、オリジナルの.AddChoices()コールをコメントアウトし、.AddChoiceGroup()を紹介しています(3:32-3:38)。 これにより、関連する項目をラベルの下にグループ化することができる。 と彼は書いています:
.AddChoiceGroup("The usual names", usualNames)
.AddChoiceGroup("Family names", familyNames).AddChoiceGroup("The usual names", usualNames)
.AddChoiceGroup("Family names", familyNames)さて、プロンプトでは各グループが別々に表示されます。 この構成は、数十のオプションを提示し、ページやグループに整理したい場合に特に役立ちます。 トランスクリプトには表示されていませんが、Spectre Console の複数選択プロンプトには PageSize プロパティもあります。
グループ選択がランタイムでどのように動作するか
Timはコードを保存し、再度実行する(4:11)。 新しいプロンプトは、両方のグループを明確なラベルで表示します。 カーソルを "The usual names "ラベルに移動してスペースバーを押すと、そのグループのすべての項目が一度に選択される(4:17-4:19)。
彼はまた、Spectre Consoleが、リストが画面より長い場合、自動的にスクロールを処理することを指摘しています - グレーで"より多くの選択肢を表示するには、上下に移動します"というメッセージが表示されます(4:25-4:31)。 これはスクロール可能なリストのデフォルトの動作です。
Timは、姓までスクロールして選択し、Sue Stormのような個人も選択することを実演している(4:39-4:43)。 彼がEnterを押すと、コンソールは選択されたすべての名前を組み合わせて出力する(4:45)。 これは、関数がどのように多くの選択肢を表示し、それらを切り替えることができ、選択されたオブジェクトの単一のリストを返すかを示しています。

複数選択プロンプトと選択プロンプトの比較を理解する
5:00にティムが示した内容を要約する。 複数選択プロンプトは、通常の選択プロンプトと同じように動作しますが、どのような型を渡してもリストを返します(5:03-5:08)。
彼がしたように指示文を追加し、選択グループを使ってグループ全体を整理し、オプションで1回のキー操作で選択することができる(5:14-5:18)。 これにより、大規模または複雑なメニューが、ユーザーにとってより扱いやすくなります。
これは、Spectre Console が複雑なオブジェクトを扱うことができることも示唆しています。 ChoiceLabelプロパティを持つオブジェクトを提供することで、表示される内容を制御することができます。
選択肢グループとラベルの柔軟な使用
Timはまた、.AddChoiceGroup()を使うのに2つのグループを持つ必要はないことも明らかにしている(5:20-5:24)。 1つのグループであっても、グループ全体を一度に選択できるという利点があります。
彼は、より一般的なものにするために、"Select All"のようなグループ名をつけることができることを示している(5:34-5:42)。 一番上の項目を選択すると、下の項目がすべて切り替わります(5:44-5:47)。 また、例えばグループラベルを緑色や青色にして区別するなど、カラーハイライトを使用して、ユーザーをデフォルトのグループや必要なグループに誘導することもできます。これにより、プロンプトの構成に柔軟性が生まれます。
まとめ
Tim は、ビデオを要約して終わります: グループ化された選択のための選択肢グループの追加を含む、Spectre Console で複数選択プロンプトを実行する方法です(5:50-5:53)。 いつものように、ソースコードは説明の中にあります(5:57)。
ティム・コーリーのウォークスルーからの主な要点
Spectre Console のマルチセレクトでは、リストからゼロ、1、または多数の項目を選択できます。
ユーザーをガイドするためのタイトルと説明テキストを追加します; 必要な情報を強調するためにアクセントカラーを使用することができます。
単純なリストには .AddChoices() を使用し、複数のリストやグループ化されたリストには .AddChoiceGroup() を使用してください。
ユーザーは、Spaceを押して選択を切り替え、Enterを押して承諾します。
グループラベル自体を切り替えて、すべての項目を一度に選択することができます。
プロンプトは、ChoiceLabelプロパティを持つ複雑なオブジェクトを表示することができます。
- ページサイズとスクロールは、1ページに収まらないほどの選択肢がある場合に役立ちます。
Tim Corey の例(通常の名前と姓の実際のリスト)に従うことで、あなた自身の Spectre Console アプリケーションに、クリーンでユーザーフレンドリーな複数選択リストを素早く実装することができます。

