diff --git a/83 Stock Market/csharp/src/Extensions/ImmutableArrayExtensions.cs b/83 Stock Market/csharp/src/Extensions/ImmutableArrayExtensions.cs
new file mode 100644
index 00000000..544c7625
--- /dev/null
+++ b/83 Stock Market/csharp/src/Extensions/ImmutableArrayExtensions.cs
@@ -0,0 +1,37 @@
+using System;
+using System.Collections.Immutable;
+
+namespace Game.Extensions
+{
+ ///
+ /// Provides additional methods for the class.
+ ///
+ public static class ImmutableArrayExtensions
+ {
+ ///
+ /// Maps each element in an immutable array to a new value.
+ ///
+ ///
+ /// The type of elements in the source array.
+ ///
+ ///
+ /// The type of elements in the resulting array.
+ ///
+ ///
+ /// The source array.
+ ///
+ ///
+ /// Function which receives an element from the source array and its
+ /// index and returns the resulting element.
+ ///
+ public static ImmutableArray Map(this ImmutableArray source, Func selector)
+ {
+ var builder = ImmutableArray.CreateBuilder(source.Length);
+
+ for (var i = 0; i < source.Length; ++i)
+ builder.Add(selector(source[i], i));
+
+ return builder.MoveToImmutable();
+ }
+ }
+}
diff --git a/83 Stock Market/csharp/src/Program.cs b/83 Stock Market/csharp/src/Program.cs
index 8d2b2a98..a7ab841a 100644
--- a/83 Stock Market/csharp/src/Program.cs
+++ b/83 Stock Market/csharp/src/Program.cs
@@ -9,7 +9,7 @@ namespace Game
///
/// Defines the set of companies that will be simulated in the game.
///
- private static ImmutableArray Companies = ImmutableArray.CreateRange(new[]
+ private readonly static ImmutableArray Companies = ImmutableArray.CreateRange(new[]
{
new Company("INT. BALLISTIC MISSILES", "IBM", sharePrice:100),
new Company("RED CROSS OF AMERICA", "RCA", sharePrice:85 ),
diff --git a/83 Stock Market/csharp/src/StockMarket.cs b/83 Stock Market/csharp/src/StockMarket.cs
index ba2f52ee..36201074 100644
--- a/83 Stock Market/csharp/src/StockMarket.cs
+++ b/83 Stock Market/csharp/src/StockMarket.cs
@@ -38,13 +38,13 @@ namespace Game
},
(parameters, previousDay) => previousDay with
{
- Companies = ImmutableArray.CreateRange(
- previousDay.Companies.Select ((company, index) => AdjustSharePrice(
+ Companies = previousDay.Companies.Map(
+ (company, index) => AdjustSharePrice(
random,
company,
parameters.trend,
parameters.positiveSpike == index,
- parameters.negativeSpike == index)))
+ parameters.negativeSpike == index))
});
}
@@ -106,7 +106,7 @@ namespace Game
/// The maximum number of days each trend should last.
///
public static IEnumerable Trends(Random random, int minDays, int maxDays) =>
- random.Integers(minDays, maxDays + 1).SelectMany(days => Enumerable.Repeat(GenerateTrend(random), days));
+ random.Integers(minDays, maxDays + 1).SelectMany(daysInCycle => Enumerable.Repeat(GenerateTrend(random), daysInCycle));
///
/// Generates a random value for the market trend.
@@ -143,7 +143,7 @@ namespace Game
private static IEnumerable PriceSpikes(Random random, int companyCount, int minDays, int maxDays) =>
random.Integers(minDays, maxDays + 1)
.SelectMany(
- days => Enumerable.Range(0, days),
- (days, dayNumber) => dayNumber == 0 ? random.Next(companyCount) : default(int?));
+ daysInCycle => Enumerable.Range(0, daysInCycle),
+ (daysInCycle, dayNumber) => dayNumber == 0 ? random.Next(companyCount) : default(int?));
}
}