Multi-Select Lists with Groupings - Spectre Console Series
Spectre Console is a .NET library that lets you transform plain C# console applications into visually rich, interactive tools. Instead of static black-and-white screens, you can prompt users with colours, layouts, and interactive choices. In this article, we’ll dive into one of its most powerful input features — multi-selection prompts — and specifically how to use choice groups.
We’re going to do this by following Tim Corey’s walkthrough from his video “Multi-Select Lists with Groupings – Spectre Console Series”. Tim explains, shows code, and runs it, so you can see how to implement this in your own project. Below, each heading notes the approximate time in the video when that topic appears so you can jump straight to it.
Introduction to the Multi-Selection Prompt
At the start of the video, Tim Corey reminds viewers that Spectre Console allows you to “turn your C# console apps into visually appealing, informative applications” (0:02). His series takes the library piece by piece in ten-minute chunks. This particular video focuses on asking the user to choose one or more choices from a list or from multiple lists using the multi-selection prompt (0:18).
Setting Up a Simple Multi-Selection Prompt
Tim begins by showing two lists he already has in his code:
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.)
He creates a List
Tim emphasises that each choice will be a string object and the prompt will return an array or list of the user’s selected choices (1:20–1:26).
He then adds a custom title to guide the user:
.Title("Which are your favorite placeholder names?").Title("Which are your favorite placeholder names?")This sets up a clear header at the top of the prompt (1:31–1:50).
Adding Instruction Text for User Guidance
Tim doesn’t stop at just a title. He also adds instruction text to tell the user how to interact with the prompt (1:50).
He writes something like:
.InstructionsText("(Press <space> to toggle, <enter> to accept)").InstructionsText("(Press <space> to toggle, <enter> to accept)")At 1:56 he explains you can even format it with colours or other styling — Spectre Console supports customizing accent color so your instructions could appear in green, blue, yellow, grey, or red to highlight key parts.
The important part is telling the user: press the space bar to toggle items, press enter to accept your answer (2:12). This makes the script easy for the user.
Adding Choices and Displaying the Results
Next, Tim adds the actual data. Initially he keeps it simple with one list. He uses .AddChoices(usualNames) (2:24–2:34).
Then he writes a straightforward foreach loop to output the user’s selections back to the console (2:38–2:52):
foreach (var name in favoriteNames)
{
Console.WriteLine(name);
}foreach (var name in favoriteNames)
{
Console.WriteLine(name);
}He’s not worrying about formatting — just showing that the multi-selection prompt works (2:53–3:00).
Tim runs the program in the terminal (3:00). The prompt shows his list of names. He uses the space bar to pick a few items — like “Tim Corey” and “Sue Storm” — then hits Enter, and the console prints out the options chosen (3:07–3:15). This demonstrates the simplest working version.

Moving to Multiple Lists with Choice Groups
With the basic setup working, Tim makes things “a little more interesting” (3:22). Instead of just one list, he has two lists: usualNames and familyNames.
He comments out the original .AddChoices() call and introduces .AddChoiceGroup() (3:32–3:38). This allows him to group related items under a label. He writes:
.AddChoiceGroup("The usual names", usualNames)
.AddChoiceGroup("Family names", familyNames).AddChoiceGroup("The usual names", usualNames)
.AddChoiceGroup("Family names", familyNames)Now, each group will appear separately in the prompt. This structure is especially helpful when you’re presenting dozens of options and want to organise them into pages or groups. Even though the transcript doesn’t show it, Spectre Console’s multi-selection prompt also has a PageSize property so you can control how many items display at once when there are more choices than fit on one screen.
How Group Selection Works at Runtime
Tim saves and runs the code again (4:11). The new prompt shows both groups with clear labels. If he moves the cursor to “The usual names” label and hits the space bar, all items in that group are selected at once (4:17–4:19).
He also points out that Spectre Console automatically handles scrolling if the list is longer than the screen — you’ll see a “move up and down to reveal more choices” message in grey (4:25–4:31). That’s a default behaviour for scrollable lists.
Tim demonstrates scrolling to the family names, selecting them, and then selecting an individual like Sue Storm as well (4:39–4:43). When he hits Enter, the console prints out all the chosen names combined (4:45). This shows how the function displays more choices, lets you toggle them, and then returns a single list of selected objects.

Understanding the Multi-Selection Prompt vs. Selection Prompt
At 5:00 Tim sums up what he’s shown. The multi-selection prompt works like the regular selection prompt but returns a list of whatever type you pass in (5:03–5:08).
You can add instruction text as he did, and you can use choice groups to organise and optionally select entire groups with one keystroke (5:14–5:18). This makes large or complex menus much more manageable for the user.
This also hints at Spectre Console’s ability to work with complex objects: your choice object can be more than a string. You can supply an object with a ChoiceLabel property to control what is displayed, while still receiving the full object back when the user accepts their answer.
Flexible Use of Choice Groups and Labels
Tim also clarifies that you don’t have to have two groups to use .AddChoiceGroup() (5:20–5:24). Even with a single group, you still get the benefit of being able to select the entire group at once.
He shows you can name the group something like “Select All” to be more generic (5:34–5:42). Selecting that top entry would then toggle all items below (5:44–5:47). You could also use colour highlighting — for example making the group label green or blue to distinguish it — to guide the user to the default or required group. This gives you a lot of flexibility in how you structure your prompts.
Wrapping Up
Tim ends the video by summarising: that’s how to do multi-selection prompts with Spectre Console, including adding choice groups for grouped selection (5:50–5:53). As always, the source code is in the description (5:57).
Key Takeaways from Tim Corey’s Walkthrough
Spectre Console multi-select lets users pick zero, one, or many items from a list.
Add a title and instruction text to guide users; you can use accent color to highlight required information.
Use .AddChoices() for a simple list; use .AddChoiceGroup() for multiple or grouped lists.
Users press Space to toggle selections and Enter to accept.
Group labels themselves can be toggled to select all items at once.
The prompt can display complex objects with a ChoiceLabel property while returning the underlying object.
- Page size and scrolling help when you have more choices than fit on one page.
By following Tim Corey’s example — with his actual lists of usual names and family names — you can quickly implement clean, user-friendly multi-select lists in your own Spectre Console applications.
