Запятая в c # вызывает системное исключение - PullRequest
0 голосов
/ 10 ноября 2019

Я должен вернуть максимальное число из серии чисел. У меня есть крайний случай, когда я могу получить запятую. Как убрать запятую, чтобы приложение не сломалось?

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

namespace ConsoleApp1
{
    class Exercises
    {
        public static void findMax()
        {
            Console.WriteLine("Enter a series of numbers: ");
            string userInput = Console.ReadLine();

            List<string> dataSet = userInput.Split(',').ToList();

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

            try
            {
                foreach (string x in dataSet)
                {
                    parsedDataSet.Add(Convert.ToInt32(x));
                }
            }
            catch(SystemException)
            {
                 dataSet = String.Join(",", dataSet).TrimStart(",");  // <-- Here
            }

            var maxInput = parsedDataSet.Max();

            Console.WriteLine(String.Format("The maximum number within your list is: {0}",maxInput));
        }
    }
}

Ответы [ 4 ]

1 голос
/ 10 ноября 2019

Проблема должна заключаться не в ведущей запятой, а в пустой строке, которая разделяется, генерирует для «до».

Так что проверяйте эту строку на достоверность перед анализом. String.isNullorWhitespace() может это сделать. Но, вероятно, лучше использовать TryParse(), а не Parse (который будет вызываться Convert.ToInt32()). Parse - это ребенок, который бросает досадные исключения. Именно поэтому TryParse() был добавлен с первым обновлением Framework, 2.0

foreach (string x in dataSet)
{
  int parsed;
  bool success = Int32.TryParse(x, out parsed);
  if(success){
    parsedDataSet.Add(parsed);
  }
  else{
    //parsed has to be set by compiler rules for out.
    //So it is 0 at this. You propably do not want add it to that collection
    //Indeed the else is only here for that comment.
  }
}
1 голос
/ 10 ноября 2019

если это единственная проблема, то вы можете сделать:

foreach (string x in dataSet)
{
    if (Int32.TryParse(x, out int x2))
        parsedDataSet.Add(x2);
}
0 голосов
/ 10 ноября 2019

Если ваша строка имеет начальную запятую, то в результирующем массиве первый элемент будет пустым. Поскольку они вам не нужны, скажите от Split до не возвращать пустые элементы для начала:

List<string> dataSet = userInput.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList();
0 голосов
/ 10 ноября 2019

string.Join возвращает string, который вы пытаетесь присвоить List<string>, и вы никогда не используете dataset после, поэтому ваш дизайн имеет недостатки.

Также вы должны написать TrimStart(','), потому что он принимает символ, а не строку.

Вам нужно, как уже упоминалось, int.TryParse и проверить, является ли результат истинным, чтобы добавить преобразованныйзначение в случае успеха:

foreach ( string x in dataSet )
{
  if ( int.TryParse(x, out var value) )
    parsedDataSet.Add(value);
}

Таким образом, вы можете удалить пробный улов.

...