Показать, сколько раз конкретное число найдено в массиве - PullRequest
0 голосов
/ 08 октября 2019

Первая часть моего кода, где входные числа помещаются в массив, эта часть работает нормально. Во второй части вам нужно прочитать в searchterm и искать searchterm в массиве. После его поиска мне нужно показать, сколько раз searchterm находится в массиве. Вторая часть - это то, что я пробовал, но она не работает.

int[] number = new int[20];
int i = 0;
int notnull = 1;
while ( ( i < 20 ) && ( notnull != 0 ) )
{
  Console.Write("Give a number <0 = stop> : ");
  number[i] = int.Parse(Console.ReadLine());
  notnull = number[i];
  i++;
}

Console.WriteLine("Give searchterm (number): ");
int searchterm = int.Parse(Console.ReadLine());
int count = 1;
if ( searchterm == number[i] )
  count++;

Console.WriteLine("The number {0} shows up {1} times", searchterm, count);

Ответы [ 3 ]

3 голосов
/ 08 октября 2019

Вы можете легко считать элементы в массиве или IEnumerable в целом, которые должны удовлетворять определенному условию, с помощью LINQ Count () :

Console.WriteLine("Give searchterm (number): ");
int searchterm = int.Parse(Console.ReadLine());
int count = number.Count(i => i == searchterm);
Console.WriteLine("The number {0} shows up {1} times", searchterm, count);
0 голосов
/ 08 октября 2019

Во-первых, давайте избавимся от магических чисел - 20 в вашем случае;давайте изменим тип коллекции: массив не имеет Add, который List<T> обеспечивает:

   List<int> number = new List<int>();

Тогда давайте будем осторожны с пользовательским вводом: что, если пользователь поставит bla-bla-bla? Чтобы избежать сбоя , мы можем использовать TryParse вместо Parse:

   while (true) {
     // 0 is not a good choice; let it be Q (Quit) instead
     Console.WriteLine("Give a number or Q to stop : ");

     // Trim: let's be nice and tolerate trailing/leading spaces 
     string input = Console.ReadLine().Trim(); 

     // Let's accept Q, q, quit, etc.
     if (input.StartsWith("Q", StringComparison.OrdinalIgnoreCase))
       break;           

     if (int.TryParse(input, out int value)) 
       number.Add(value);  
     else
       Console.WriteLine("Sorry, invalid input");
   }

Теперь у нас есть number для работы. Получим searchterm по методике (TryParse)

   int searchterm = -1; // initialization, let compiler be happy

   while (true) {    
     Console.WriteLine("Give searchterm (number): ");

     if (int.TryParse( Console.ReadLine(), out searchterm))
       break;

     Console.WriteLine("Sorry, invalid input");         
   }

Наконец, давайте вычислим count;обычно для этого мы ставим Linq :

   int count = number.Count(searchterm);

Однако, если вы хотите старые добрые циклы

   int count = 0;

   foreach (var item in number)
     if (item == searchterm) 
       count += 1;

Последнее предложение - использовать интерполяция строк более читабельно, чем форматирование :

   Console.WriteLine($"The number {searchterm} shows up {count} times");  
0 голосов
/ 08 октября 2019

Вы можете попробовать это:

using System.Linq;
using System.Collections.Generic;

static void Test()
{
  int capacity = 20;
  List<int> numbers = new List<int>(capacity);

  Console.WriteLine($"Enter up to {capacity} numbers (0 or not an integer to stop): ");
  int value = 0;
  do
  {
    int.TryParse(Console.ReadLine(), out value);
    if ( value != 0 )
      numbers.Add(value);
  }
  while ( numbers.Count < capacity && value != 0 );

  if ( numbers.Count > 0 )
  {
    Console.WriteLine();
    Console.WriteLine("Enter a number to search occurences: ");
    int.TryParse(Console.ReadLine(), out value);
    if ( value > 0 )
    {
      Console.WriteLine();
      Console.WriteLine("The number {0} shows up {1} times",
                        value, 
                        numbers.Count(n => n == value));
    }
  }
}

Образец:

Enter up to a number (0 or not an integer to stop):
1
2
3
1
5
6
7
3
2
0

Enter un number to search occurences:
3

The number 3 shows up 2 times
...