diff --git a/Elsa.sln b/Elsa.sln
index 57df1387b..f500e29f7 100644
--- a/Elsa.sln
+++ b/Elsa.sln
@@ -222,6 +222,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Activities.Rebus", "sr
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Samples.UserTaskConsole", "src\samples\console\Elsa.Samples.UserTaskConsole\Elsa.Samples.UserTaskConsole.csproj", "{9BF25FEF-B667-4BB0-882D-6911B9F5B3C7}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.ForEachLoopConsole", "src\samples\console\Elsa.Samples.ForEachLoopConsole\Elsa.Samples.ForEachLoopConsole.csproj", "{43EC7BEE-35C5-4B70-AC39-C89696710310}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -532,6 +534,10 @@ Global
{9BF25FEF-B667-4BB0-882D-6911B9F5B3C7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9BF25FEF-B667-4BB0-882D-6911B9F5B3C7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9BF25FEF-B667-4BB0-882D-6911B9F5B3C7}.Release|Any CPU.Build.0 = Release|Any CPU
+ {43EC7BEE-35C5-4B70-AC39-C89696710310}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {43EC7BEE-35C5-4B70-AC39-C89696710310}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {43EC7BEE-35C5-4B70-AC39-C89696710310}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {43EC7BEE-35C5-4B70-AC39-C89696710310}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -636,6 +642,7 @@ Global
{76BF833E-3CAE-4402-99F1-B3BFD90622E4} = {E42743A0-FBDD-4150-9D53-6000496D9B87}
{9CBD9317-FD12-4BB9-A17D-CE7FA6B12DD8} = {B43B546E-23F3-46E8-ACB7-D04F05CDA180}
{9BF25FEF-B667-4BB0-882D-6911B9F5B3C7} = {FC9F520F-BA51-4AD2-BFEE-EF787798E734}
+ {43EC7BEE-35C5-4B70-AC39-C89696710310} = {FC9F520F-BA51-4AD2-BFEE-EF787798E734}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {8B0975FD-7050-48B0-88C5-48C33378E158}
diff --git a/src/samples/console/Elsa.Samples.ForEachLoopConsole/Elsa.Samples.ForEachLoopConsole.csproj b/src/samples/console/Elsa.Samples.ForEachLoopConsole/Elsa.Samples.ForEachLoopConsole.csproj
new file mode 100644
index 000000000..1d890858d
--- /dev/null
+++ b/src/samples/console/Elsa.Samples.ForEachLoopConsole/Elsa.Samples.ForEachLoopConsole.csproj
@@ -0,0 +1,17 @@
+
+
+
+ Exe
+ net5.0
+ false
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/samples/console/Elsa.Samples.ForEachLoopConsole/ForEachLoopWorkflow.cs b/src/samples/console/Elsa.Samples.ForEachLoopConsole/ForEachLoopWorkflow.cs
new file mode 100644
index 000000000..88f28c166
--- /dev/null
+++ b/src/samples/console/Elsa.Samples.ForEachLoopConsole/ForEachLoopWorkflow.cs
@@ -0,0 +1,25 @@
+using System;
+using System.Globalization;
+using System.Linq;
+using Elsa.Activities.Console;
+using Elsa.Activities.ControlFlow;
+using Elsa.Activities.Primitives;
+using Elsa.Builders;
+
+namespace Elsa.Samples.ForEachLoopConsole
+{
+ ///
+ /// This workflow prompts the user to enter an integer start value, then iterates back from that value to 0.
+ /// The workflow also demonstrates retrieving runtime values such as user input.
+ ///
+ public class ForEachLoopWorkflow : IWorkflow
+ {
+ public void Build(IWorkflowBuilder builder)
+ {
+ builder
+ .WriteLine("Enumerating all months of the year:")
+ .ForEach(DateTimeFormatInfo.CurrentInfo!.MonthNames.Cast