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?)); } }