C #: проверка ввода пользователя со списком строковых массивов - PullRequest
0 голосов
/ 20 октября 2018

Базовая информация

  • Язык программирования : C # (C Sharp)

  • Тип программы : Консольное приложение .Net Core 2.0

  • IDE : Сообщество Visual Studios 2017 v15.8.7

Информация о программе

Название программы : Счетчик календаря

Основы моей программы : Пользователь вводит данные за месяц и сообщает им, сколькодни в этом месяце.Пользователь может свободно вводить любую известную комбинацию названия месяца / имени (например, март, март, мар, мар, март, мар., 03 или 3).

Выполнение моих программ : Программа запрашивает у пользователя месяц, и он вводит его. Затем программа проверяет, что пользователь ввел в метод с именем MonthDatabase (), с помощью String Array.Если он совпадает, отображается месяц, в котором они набрали, и сколько дней у него есть.

Информация о выпуске

Вопрос о программе : Моя главная проблема - найти способ проверитьчто пользователь ввел с тем, что находится в массиве строк.Я пробовал переключатели и различные операторы if, но большинство из них дают мне ошибку (я не буду публиковать все из них).Я также попробовал это, используя словарь и список.Каждый выдавал свои ошибки.Поэтому я вернулся к использованию строкового массива и после многих поисков и проб разных вещей, которые просто не работали.Я даже пытался гуглить то, что я искал (например, проверять ввод пользователя с помощью массива строк), но безрезультатно.В настоящее время я получаю сообщение об ошибке:

Делегирование метода экземпляра не может иметь значение null 'this'.

Теперь я новичок в C # (и программировании в целом) Iмог только предположить, что он хочет, чтобы я указал, что проверять в массиве строк, чтобы сопоставить его с вводом пользователя.Я попробовал что-то вроде:

Console.Write("Enter a month?: ");
string userMonth = (Console.ReadLine());

if (userMonth == mData(1, 1)) //Compare user input to MonthDataBase
        {
            Console.WriteLine("You typed a word found in the datatbase.");
        }
        else
        {
            Console.WriteLine("You didn't type a word in the datatbase.");
        }

И

Console.Write("Enter a month?: ");
string userMonth = (Console.ReadLine());

if (userMonth == mData[1, 1]) //Compare user input to MonthDataBase
        {
            Console.WriteLine("You typed a word found in the datatbase.");
        }
        else
        {
            Console.WriteLine("You didn't type a word in the datatbase.");
        }

Думая, что это посмотрит на строку в этой позиции и совпадет с ней, но ясно, что я ошибаюсь в этом предположении.Я даже пытался в Google посмотреть, есть ли способ просто сопоставить то, что пользователь набрал, со всем массивом строк, но ничего не нашел.

Я потратил неделю, пытаясь выяснить это, и решил прийтиздесь, чтобы увидеть, если кто-нибудь может указать мне в правильном направлении.Мне нравится идея его изучения, поэтому, если возможно, нет прямых ответов, как «делай это», и это сработает.Может быть, пример (другой, но близкий к тому, что я пытаюсь сделать) или «прочитайте это», и это должно помочь вам.

Код

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

namespace Calendar_Counter
{
    class Program
    {
    public static string mData { get; private set; } //Use mData in any method.

    static void Main(string[] args)
        {
            Header(); //Call Header Method & display
            Menu(); //Call Menu Method & display
            CCDatatbase(); //Call Calendar Counter Database Method, execute & display.

            //Console.WriteLine("Hello World!");
            ExitProgram(); //Call exit program, execute & display
        }
        static void Header()
        {
            Console.Clear(); //Clear console buffer & console window of display information
            Console.Write("--------------------\n| Calendar Counter |\n--------------------\n"); //Display Header text
        }
        static void Menu()
        {
            //ADD menu options once basic program is working!!
            Console.WriteLine(); //Space
            Console.Write("MENU: //ADD menu options once basic program is working!!");
            Console.WriteLine("\n"); //Double Space
        }
        static void CCDatatbase()
        {

            Console.Write("Enter a month?: ");
            string userMonth = (Console.ReadLine());

            if (userMonth.Any(mData.Contains)) //Compare user input to MonthDataBase
            {
                Console.WriteLine("You typed a word found in the datatbase.");
            }
            else
            {
                Console.WriteLine("You didn't type a word in the datatbase.");
            }
        }
        public static string[,] MonthDataBase() //Month Database
        {
            //Check user input with Array List.
            string[,] mData = new string[12, 8]
            {
                { "January", "january", "Jan", "jan", "Jan.", "jan.", "1", "01" }, //If user types 1-8 display corisponding message in CCDatatbase()
                { "January", "january", "Feb", "feb", "Feb.", "feb.", "2", "02" },
                { "March", "march", "Mar", "mar", "Mar.", "mar.", "3", "03" },
                { "April", "april", "Apr", "apr", "Apr.", "apr.", "4", "04" },
                { "May", "may", "May", "may", "May", "may", "5", "05" },
                { "June", "june", "Jun", "jun", "Jun.", "jun.", "6", "06" },
                { "July", "july", "Jul", "jul", "Jul.", "jul.", "7", "07" },
                { "August", "august", "Aug", "aug", "Aug.", "aug.", "8", "08" },
                { "September", "september", "Sep", "sep", "Sep.", "sep.", "9", "09" },
                { "October", "october", "Oct", "oct", "Oct.", "oct.", "10", "10" },
                { "November", "november", "Nov", "nov", "Nov.", "nov.", "11", "11" },
                { "December", "december", "Dec", "dec", "Dec.", "dec.", "12", "12" }
            };

            return mData;
        }
        static void ExitProgram()
        {
            //REPLACE later with an actual exit option in menu!!
            Console.Write("EXIT: //REPLACE later with an actual exit option in menu!!\n\n");
            //Prevent Debugging test from closing.
            Console.Write("Press any key to Exit...");
            Console.ReadLine();
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

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

Вот мой подход к проблеме.

  1. Iсоздали класс с именем Месяц (имя, которое вы можете изменить в соответствии с вашими потребностями).

  2. У класса "Месяц" есть свойство списка MonthNames, как показано ниже,

      public class Month {
      public List<string> MonthNames { get; set; }
    
      public Month()
      {
          MonthNames = new List<string>();
      } }
    
  3. Создайте объект типа Month, как показано ниже в вашем методе GetMonths ().(В этом случае вы можете отказаться от метода MonthDataBase ()).

          private static List<Month> GetMonths()
          {
              var months = new List<Month>();
              var month = new Month();
              month.MonthNames.Add("January");
              month.MonthNames.Add("january");
              month.MonthNames.Add("Jan");
              month.MonthNames.Add("01");
              months.Add(month);
    
              month = new Month();
              month.MonthNames.Add("Feburary");
              month.MonthNames.Add("feburary");
              month.MonthNames.Add("Feb");
              month.MonthNames.Add("02");
              months.Add(month);
              // Similary add all other to the list.
    
              return months;
          }
    
  4. Вот остальная часть кода (Вы добавляете этот код ниже, куда хотите в своей программе),

              Console.Write("Enter a month?: ");
              var userMonth = (Console.ReadLine());
              var months = GetMonths();
    
              var result = months.Where(x => x.MonthNames.Any(y => y.Equals(userMonth))).ToList();
    

Примечание: - Я вернулся как ToList (), но в вашем случае вы можете вернуться как FirstOrDefault ().Итак, теперь у вас есть объект Month с вами, и, основываясь на данных, вы можете напечатать no.дней или делать что-то другое, зависит только от вас.

Надеюсь, это понятно для вас.Попробуйте и сообщите в случае каких-либо ошибок или сомнений.

0 голосов
/ 20 октября 2018
  1. Попробуйте изменить тип возврата вашего MonthDataBase метода на List<List<string>>.

  2. Попробуйте изменить сигнатуру mData публичной собственности на public static List<List<string>> mData { get; private set; }

  3. Заполните указанное выше свойство mData в CCDatatbase, например, mData = MonthDataBase();

  4. Затем проверьте, присутствует ли введенная строка в mData или нет.

Итак, наконец, ваша программа будет.

class Program
{
    public static List<List<string>> mData { get; private set; } //Use mData in any method.

    static void Main(string[] args)
    {
        Header();       // Call Header Method & display
        Menu();         // Call Menu Method & display
        CCDatabase();   // Call Calendar Counter Database Method, execute & display.

        //Console.WriteLine("Hello World!");
        ExitProgram(); //Call exit program, execute & display
    }

    static void Header()
    {
        Console.Clear(); //Clear console buffer & console window of display information
        Console.Write("--------------------\n| Calendar Counter |\n--------------------\n"); //Display Header text
    }

    static void Menu()
    {
        //ADD menu options once basic program is working!!
        Console.WriteLine(); //Space
        Console.Write("MENU: //ADD menu options once basic program is working!!");
        Console.WriteLine("\n"); //Double Space
    }

    static void CCDatabase()
    {
        mData = MonthDataBase();
        Console.Write("Enter a month?: ");
        string userMonth = (Console.ReadLine());

        if (mData.Any(x => x.Contains(userMonth))) //Compare user input to MonthDataBase
        {
            var month = mData.Where(x => x.Contains(userMonth)).Select(x => new { Days = x[0], Name = x[1] }).FirstOrDefault();
            Console.WriteLine($"{month.Name} has {month.Days} days in it.");
            Console.WriteLine();
        }
        else
        {
            Console.WriteLine("You didn't type a word in the database.");
            Console.WriteLine();
        }
    }

    public static List<List<string>> MonthDataBase() //Month Database
    {
        var mData = new List<List<string>>  {
      new List<string>  { "31", "January", "january", "Jan", "jan", "Jan.", "jan.", "1", "01" }, //If user types 1-8 display corresponding message in CCDatatbase()
      new List<string>  { "28/29", "February", "february", "Feb", "feb", "Feb.", "feb.", "2", "02" },
      new List<string>  { "31", "March", "march", "Mar", "mar", "Mar.", "mar.", "3", "03" },
      new List<string>  { "30", "April", "april", "Apr", "apr", "Apr.", "apr.", "4", "04" },
      new List<string>  { "31", "May", "may", "May", "may", "May", "may", "5", "05" },
      new List<string>  { "30", "June", "june", "Jun", "jun", "Jun.", "jun.", "6", "06" },
      new List<string>  { "31", "July", "july", "Jul", "jul", "Jul.", "jul.", "7", "07" },
      new List<string>  { "31", "August", "august", "Aug", "aug", "Aug.", "aug.", "8", "08" },
      new List<string>  { "30", "September", "september", "Sep", "sep", "Sep.", "sep.", "9", "09" },
      new List<string>  { "31", "October", "october", "Oct", "oct", "Oct.", "oct.", "10", "10" },
      new List<string>  { "30", "November", "november", "Nov", "nov", "Nov.", "nov.", "11", "11" },
      new List<string>  { "31", "December", "december", "Dec", "dec", "Dec.", "dec.", "12", "12" }
    };

        return mData;
    }

    static void ExitProgram()
    {
        //REPLACE later with an actual exit option in menu!!
        Console.Write("EXIT: //REPLACE later with an actual exit option in menu!!\n\n");
        //Prevent Debugging test from closing.
        Console.Write("Press any key to Exit...");
        Console.ReadLine();
    }
}

Ввод: июл

Выход:

enter image description here

Вход: 04

Выход:

enter image description here

Ввод: abcd

Выход:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...