-3

How do I go about adding a code which displays the number of even numbers generated here, instead of displaying all even numbers generated, and where do I add this in?

class Program
    {
        static void Main(string[] args)
        {
            Random number = new Random();
            int rangeFrom = 1;
            int rangeTo = 999;
            List<int> generatedNumbers = new List<int>();

            for (int counter = 0; counter < 100; counter++)
            {
                generatedNumbers.Add(number.Next(rangeFrom, rangeTo));
            }

            generatedNumbers.Sort();

            string output = "Numbers: {0} \r\n\rMinimum Number: {1}\r\n\r\nMaximum Number: {2}\r\n\r\nRange of Numbers: {3}-{4}";

            output = string.Format(output, string.Join(", ", generatedNumbers.ToArray()), generatedNumbers.Min(), generatedNumbers.Max(), rangeFrom, rangeTo);


            MessageBox.Show(output);
        }
    }
}
  • Just a small note - the code `number.Next(rangeFrom, rangeTo)` produces numbers from `rangeFrom` to `rangeTo - 1` inclusively. You need to write `number.Next(rangeFrom, rangeTo + 1)` if you want to include the number `rangeTo` in your output. – Enigmativity Feb 23 '17 at 01:38
  • You don't need `generatedNumbers.Sort();`, see http://stackoverflow.com/questions/1043039/does-listt-guarantee-insertion-order – djv Feb 23 '17 at 02:11

3 Answers3

3

Try this generatedNumbers.Where(x => x % 2 == 0).Count() like this:

string output = "Numbers: {0} \r\n\r\nEven Numbers: {1} \r\n\r\nMinimum Number: {2}\r\n\r\nMaximum Number: {3}\r\n\r\nRange of Numbers: {4}-{5}";

output = string.Format(output, string.Join(", ", generatedNumbers.ToArray()), generatedNumbers.Where(x => x % 2 == 0).Count(), generatedNumbers.Min(), generatedNumbers.Max(), rangeFrom, rangeTo);

Just to make your code a little more readable you could also do it this way:

Random number = new Random();

int rangeFrom = 1;
int rangeTo = 999;

List<int> generatedNumbers =
    Enumerable
        .Range(0, 100)
        .Select(x => number.Next(rangeFrom, rangeTo + 1))
        .OrderBy(x => x)
        .ToList();

var results = new []
{
    "Numbers: " + String.Join(", ", generatedNumbers),
    "Even Numbers: " + generatedNumbers.Where(x => x % 2 == 0).Count(),
    "Minimum Number: " + generatedNumbers.Min(),
    "Maximum Number: " + generatedNumbers.Max(),
    "Range of Numbers: " + rangeFrom + "-" + rangeTo,
};

string output = String.Join(Environment.NewLine + Environment.NewLine, results);

MessageBox.Show(output);
Enigmativity
  • 113,464
  • 11
  • 89
  • 172
  • And a little more readable/concise: `.Count(x => x % 2 == 0)` – DavidG Feb 23 '17 at 01:51
  • @DavidG - On one hand I agree with you, but it does make it less refactorable. It doesn't really affect performance so it's a personal preference I think. – Enigmativity Feb 23 '17 at 02:00
  • What do you mean by "less refactorable"? – DavidG Feb 23 '17 at 02:01
  • @DavidG - If I wanted to add a further condition, for example, I feel that `.Where(x => x % 2 == 0).Where(x => x > 10).Count()` is easier to refactor than `.Count(x => x % 2 == 0 && x > 10)` – Enigmativity Feb 23 '17 at 02:03
  • Hmm I think that's debatable. Also, refactoring is the process of restructuring code without changing functionailty, that's why I was confused. – DavidG Feb 23 '17 at 02:06
  • @DavidG - Well, yes, refactoring probably wasn't the right word. Perhaps just maintenance. – Enigmativity Feb 23 '17 at 02:30
1

For a bit more literate programming, you can define a predicate function:

Func<Int32,Boolean> isEven = i => i % 2 == 0;

var count = generatedNumbers.Count(isEven);
Tom Blodget
  • 20,260
  • 3
  • 39
  • 72
0
var evenNumbers = generatedNumbers.Where(n => (n % 2) == 0)

then you just add evenNumbers.Count() to your output string

Dmitry Pavlushin
  • 612
  • 8
  • 23