Как отобразить все желаемые элементы из списка <Object>в консоль (C#) - PullRequest
0 голосов
/ 01 августа 2020

Итак, я делаю меню, которое пользователь может использовать для просмотра фильмов, добавления фильмов и удаления фильмов. Прямо сейчас у меня есть меню, завершенное до такой степени, что, если пользовательский ввод - это номер 1, он должен отображать mov ie заголовок, год, директор и сводку этого mov ie на другом экране. У меня есть foreach l oop, что я использую отображение этого конкретного названия mov ie, года, директора и сводки, но когда я запускаю свою программу, он показывает только заголовок и год, и все. Как я могу показать все 4 из них одновременно в консоли? Код ниже.

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

namespace MovieLibrary
{
    // Should contain data: an address and list of movie objects.
    // MUST include a dynamic 'MENU' of MOVIES

    public class Library
    {
        // Fields
        private string _directory = "../../output/";
        private string _file = "Movies.txt";
        private List<Movie> _movies;

        public Library()
        {
            _movies = new List<Movie>();
            Load();

            bool menuRunning = true;

            while (menuRunning)
            {
                Console.WriteLine("Pick a number. Any number.");

                string userOption = Console.ReadLine();

                while (string.IsNullOrWhiteSpace(userOption))
                {
                    Console.WriteLine("Please do not leave this blank.");
                    Console.WriteLine("Pick a number. Any number.");
                    userOption = Console.ReadLine();
                }

                if (userOption == "1")
                {
                    string montyTitle;
                    int montyYear;
                    string montyDirector;
                    string montySummary;

                    foreach (Movie movie in _movies)
                    {
                        if (movie.Title == "Monty Python and the Holy Grail")
                        {
                            montyTitle = movie.Title;
                            Console.WriteLine("Title: {0}", montyTitle);
                        }
                        if (movie.Year == 1975)
                        {
                            montyYear = movie.Year;
                            Console.WriteLine("Year: {0}", montyYear);
                        }
                        if (movie.Director == "Terry Gilliam & Terry Jones")
                        {
                            montyDirector = movie.Director;
                            Console.WriteLine("Director: {0}", montyDirector);
                        }
                        if (movie.Summary == "Monty Python and the Holy Grail is about a ragtag group, the knights of the round table, assembled by the Great King Arthur to embark on a quest given by God to find the Holy Grail.")
                        {
                            montySummary = movie.Summary;
                            Console.WriteLine("Summary: {0}\r\n", montySummary);
                        }
                    }
                }

                else if (userOption == "2")
                {
                    // RE

                }

                else if (userOption == "3")
                {

                    // Alien

                }

                else if (userOption == "4")
                {
                    // DP

                }
                else if (userOption == "5")
                {
                    // The Avengers
                }
                else if (userOption == "6")
                {
                    // Zombieland

                }
                else if (userOption == "7")
                {
                    // BTLC

                }
                else if (userOption == "8")
                {
                    // The Thing

                }
                else if (userOption == "9")
                {
                    // CITW


                }

            }
        }


        //Loads the text file
        private void Load()
        {
            using (StreamReader sr = new StreamReader(_directory + _file))
            {
                string text;

                while ((text = sr.ReadLine()) != null)
                {

                    string[] contents = text.Split(':');

                    Movie newLibrary = new Movie(contents[0], int.Parse(contents[1]), contents[2], contents[3]);
                    _movies.Add(newLibrary);

                }

            }
        }
        // Allows the user to view the list of movies
        private void View()
        {
            Console.Clear();

            foreach (Movie movie in _movies)
            {
                Console.WriteLine($"{movie.Title,-10}{"\n" + movie.Year,-10}{"\n" + movie.Director,-10}{"\n" + movie.Summary + "\r\n",-10}");

            }
        }
    }

    // Allows the user to add any new movies they would like to the list of movies in the text file
    /*public static void Add()
    {

    }

    // Allows the user to remove any movies they would like from the text file
    public static void Remove()
    {

    }*/
}

Ответы [ 4 ]

0 голосов
/ 03 августа 2020

На основании моего теста, если другие ваши фильмы имеют повторяющиеся названия, годы и т. Д. c., «If (mov ie .Title ==« Монти Python и Святой Грааль »)» не может найти mov ie точно.

Ваш код l oop "while (menuRunning) {}" может измениться на следующий код:

while (menuRunning)
        {
            Console.WriteLine("Pick a number. Any number.");

            try
            {
                int userOption = int.Parse(Console.ReadLine());
                Console.Clear();
                var _myMoviesArray = _movies.ToArray();
                Console.WriteLine("Title:{0}\nYear:{1}\nDirector:{2}\nSummary:{3}\n", _myMoviesArray[userOption].Title, _myMoviesArray[userOption].Year, _myMoviesArray[userOption].Director, _myMoviesArray[userOption].Summary);
            }
            catch (Exception e) { Console.WriteLine("please enter the number in the correct format."); }
        }

Мой тестовый документ

Результат выполнения кода

0 голосов
/ 01 августа 2020

Я не уверен, какая именно часть вас беспокоит, но мне было скучно, и я решил сделать для вас простой Po C сегрегированного кода. Я определил простой репозиторий для управления данными вашей сущности и создал специальную c его реализацию, предназначенную для фильмов. Я реализовал хранение ваших фильмов в памяти, которое может иметь любую базовую реализацию, такую ​​как текстовый файл, или вы можете сохранить его в памяти и сохранить в самой библиотеке, как только вы завершите sh изменение состояния в памяти. Вы можете расширить его, изменить или полностью отказаться, если он вам не нравится.

Определение интерфейса репозитория

namespace MovieLibrary
{
    using System;
    using System.Collections.Generic;

    internal interface IRepository<T, K>
    {
        IEnumerable<T> Get();

        IEnumerable<T> Get(Func<T, bool> condition);

        T Get(K guid);

        void Add(T entity);

        void Remove(T guid);
    }
}

Mov ie реализация репозитория

namespace MovieLibrary
{
    using System;
    using System.Collections.Generic;
    using System.Linq;

    internal class MovieRepository
        : IRepository<Movie, Guid>
    {
        // In-memory storage, can be replaced with anything else.
        private readonly ISet<Movie> movies;

        public MovieRepository(IEnumerable<Movie> initialState = null)
        {
            this.movies = initialState?.ToHashSet() ?? new HashSet<Movie>();
        }

        public void Add(Movie movie) => movies.Add(movie);
        public IEnumerable<Movie> Get() => movies;
        public IEnumerable<Movie> Get(Func<Movie, bool> condition) => movies.Where(condition);
        public Movie Get(Guid guid) => movies.SingleOrDefault(movie => movie.Id == guid);
        public void Remove(Movie movie) => movies.Remove(movie);
    }
}

Mov ie определение

namespace MovieLibrary
{
    using System;

    public class Movie
    {
        public Movie(string title, int year, string director, string summary)
        {
            this.Id = Guid.NewGuid();
            this.Title = title;
            this.Year = year;
            this.Director = director;
            this.Summary = summary;
        }

        public Guid Id { get; }
        public string Title { get; }
        public int Year { get; }
        public string Director { get; }
        public string Summary { get; }

        public override bool Equals(object other) => other is Movie movie && movie.Id == this.Id;
        public override int GetHashCode() => HashCode.Combine(Id);
        public override string ToString() => string.Format(
            "-- Details --{0}{0}Title: {1}{0}Year: {2}{0}Director: {3}{0}Summary: {4}",
            Environment.NewLine,
            this.Title,
            this.Year,
            this.Director,
            this.Summary);
    }
}

Сама библиотека

namespace MovieLibrary
{
    using System;
    using System.Collections.Generic;
    using System.Linq;

    public class Library
    {
        private readonly IRepository<Movie, Guid> repository;
        private readonly IDictionary<int, Movie> menuOptions;

        public Library()
        {
            this.repository = this.InitializeRepository();
            this.menuOptions = this.repository.Get()
                .Select((movie, index) =>
                    new { Ordinal = index + 1, Movie = movie })
                .ToDictionary(
                    item => item.Ordinal,
                    item => item.Movie);
        }

        public void Run()
        {
            Console.WriteLine("Welcome to the movie library! Pick a movie you'd like to watch...");

            foreach (KeyValuePair<int, Movie> option in menuOptions)
            {
                Console.WriteLine($"{option.Key}: {option.Value.Title}");
            }

            int selectedOrdinal = 0;
            Movie selectedMovie = null;

            do
            {
                Console.Write("Select option: ");
                string input = Console.ReadLine();

                if (!int.TryParse(input, out selectedOrdinal))
                {
                    Console.WriteLine("Please pick the existing option from the list...");
                    continue;
                }

                this.menuOptions.TryGetValue(selectedOrdinal, out selectedMovie);
            }
            while (selectedMovie == null);

            Console.WriteLine("Thank you for picking our movie library! Your movie will start in a second...");

            Console.WriteLine(selectedMovie);
            Console.WriteLine("Press any key to continue...");
            Console.ReadKey();
        }

        private IRepository<Movie, Guid> InitializeRepository()
        {
            // Mocking the initial data of library. You could load it from file instead.
            IEnumerable<Movie> movies = Enumerable
                .Range(1, 10)
                .Select(ordinal => new Movie(
                    $"Title {ordinal}",
                    DateTime.UtcNow.Year + ordinal,
                    $"Some Director {ordinal}",
                    $"Some dummy summary text {ordinal}"));

            return new MovieRepository(movies);
        }
    }
}
0 голосов
/ 01 августа 2020

Могу я заставить вас сделать что-нибудь?

Выключите компьютер (возможно, после распечатки описания проблемы) и сядьте с карандашом и бумагой

Подумайте о проблеме на английском языке sh (или ваш родной язык)

  • У вас есть файл mov ie info, по одному mov ie на строку
  • Вам нужно прочитать файл, взять ввод от пользователя, который представляет собой числовой индекс mov ie в строках файла, и показывает информацию об этом mov ie в консоли

Причина Я прошу вас включить выключенный компьютер - это когда вы сидите с открытой визуальной студией и излагаете проблему, есть большой соблазн начать писать код, прежде чем думать о том, что нужно написать. Это как если вас просят построить мост, и вы немедленно отправляетесь на двор строителей и размещаете заказ на 10000 кирпичей - первый шаг к строительству моста - это выяснить все требования, нарисовать его, произвести некоторые расчеты, подумать о том, что его нужно поддерживать сейчас и в будущем. Построение моста - большая задача, это программирование, которое у вас есть, - относительно небольшая задача, но она большая для вас, потому что вы только начинаете. Как только вы поймете ценность этих предварительных упражнений по определению объема работ, я обещаю вам, что вы будете использовать их на протяжении всей своей карьеры.

Проблемы станут больше, но подход останется прежним; Изложение вашего алгоритма на бумаге очень поможет, и его следует рассматривать как написание плана эссе или составление предложения в уме на английском sh, потому что вы родной английский sh, преобразовывая его в то, как испанец sh человек сказал бы это, затем перевел бы это на испанский sh слов и произнес бы это. Все, что вы делаете, когда разрабатываете программное обеспечение, будет упражнением в переводе, от обзора заголовка до подробного обзора, до мелкозернистых процессов и, в конечном итоге, до компьютерного кода

Вы всегда можете думать на английском sh и вам придется переводить свой Engli sh мысли к c# действиям; вам нужно сначала записать процесс на английском языке sh. В конце концов вы будете думать на C# для некоторых вещей, но он всегда будет смешиваться с английским sh, особенно при работе с обычными пользователями

Вместо ручки и бумаги вы также можете сделать это в c# комментарии затем переводятся под ними (и в итоге получается красиво прокомментированный код, бонус), но, как новичок, вы получите гораздо больше от упражнения по визуализации с помощью ручки и бумаги. Вы можете легко создавать блок-схемы, боковые примечания, вставки и стирать вещи - подход Treeware всегда поможет

Итак, ваш алгоритм может выглядеть так:

  • Прочтите все строки файла
  • работать через них по одному
  • превратить строку в объект mov ie - выноска для себя, нужен объект mov ie, как он выглядит например?
  • добавить его в коллекцию Mov ie объектов
  • , что часть чтения сделана - следует где-то хранить эту коллекцию фильмов. Должен сделать эту часть чтения автономной.
  • Теперь я знаю, сколько фильмов я прочитал из файла, потому что у меня есть коллекция с подсчетом
  • спросить у пользователя индекс
  • напечатайте mov ie по этому индексу. Нет, подождите. Материал в c# равен нулю, поэтому, если пользователь хочет mov ie 1, он будет в индексе 0 списка / массива / чего угодно - не забудьте сделать -1 !!
  • спросите user для другого индекса - это повторяется, поэтому мне, вероятно, понадобится al oop. Еще одно замечание для себя: нужен способ выйти из l oop

Затем вы можете добавить

  • печать mov ie требует разрушения
  • должен иметь отдельный фрагмент кода, который печатает mov ie
  • о, там была лекция о ToString и о том, как ее можно использовать для создания строкового представления настраиваемого объекта. Обратите внимание на то, что нужно самостоятельно создать ToString в mov ie, затем вы можете просто распечатать объект mov ie, и он будет ToStringed и автоматически отформатирован

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

Ваш класс mov ie, вероятно, в порядке

Ваш метод View содержит биты, которые были бы полезны для ToString

Метод, который читает файл, тоже в порядке

Начните с простого, со stati c void main, который сначала читает фильмы (вызывает метод ReadLibrary, который возвращает List <> of Movies) и вводит al oop, которое показывает пользователю меню

Запрос ввода, только индекс mov ie для печати - ничего из этого не сохраняется, добавляются новые фильмы и т.д. c. Надо упростить запуск

Распечатать mov ie out, l oop снова округлить

С тем, что у вас уже есть в чтении, класс mov ie, превращая это Если посмотреть на переопределение ToString, вы сможете выполнить текущую задачу примерно за 10 или меньше строк кода. Если вы go значительно превысили это (а вы это делаете сейчас), то ваше мышление пошло не так.

Например, вы запрашиваете ввод, а затем говорите: «если они ввели 1, то иначе, если они ввел 2, затем ... "

Возьмите их ввод, превратите его в число и покажите mov ie под этим номером (без единицы) в коллекции. Это делает его действительно динамичным c. Подумайте, что произойдет, если они введут 999999 для смеха, а ваша коллекция mov ie будет содержать только 10 фильмов. Поставьте чек, чтобы он не сломался. Вы можете go вернуться к своей статье, где говорится: «попросите пользователя указать индекс», который вы можете добавить »и убедиться, что это не сумасшедшее значение»

Имейте метод AskString, который принимает строку question, печатает вопрос, запрашивает ввод и возвращает его

Имейте метод AskInt, который использует метод AskString и преобразует его возвращаемое значение в int. расширите метод, чтобы он мог принимать еще два параметра, а также нижнюю и верхнюю границы вопроса. Если пользователь вводит число, выходящее за границы, повторяйте AskString, пока он не введет разумное значение

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

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

0 голосов
/ 01 августа 2020

Я не очень понимаю ваш вопрос. Может случиться так, что if (movie.Director == "Terry Gilliam & Terry Jones") не входит в if.

Может быть, я могу предложить что-то другое (?)

Вам не нужно foreach l oop для итерации список. Вы можете получить элементы из своего _movies двумя разными способами:

  1. Преобразовать в массив: var _myMoviesArray = _movies.ToArray(); и получить к ним доступ по индексу (Console.WriteLine(_myMoviesArray[userOption].Title));
  2. Или используйте Console.WriteLine(_movies.IndexAt(userOption).Title).

Для печати в консоли вместо: Console.WriteLine("Title: {0}", montyTitle); можно сделать: Console.WriteLine($"Title: {movie.Title}");

И я думаю, что if(movie.Title == "Monty Python and the Holy Grail"). Если вы обращаетесь по индексу userOption, вы можете напрямую перейти к Mov ie в вашем массиве.

...