Loading...
Elena123456 avatar Elena123456 235 Точки

2. Articles - проблем с извикването на ToString()

Моля за помощ отностно извикването на ToString() метода. Изписва следното: "Redundant 'ToString()' Call" (44 ред). В лекцията методът работи, но не и при мен, че дори и да използвам отделна променлива преди да печатам резултата. Може отново проблема да е заради MonoDevelop.

2. Articles
Create a class Article with the following properties:
 Title – a string
 Content – a string
 Author – a string
The class should have a constructor and the following methods:
 Edit (new content) – change the old content with the new one
 ChangeAuthor (new author) – change the author
 Rename (new title) – change the title of the article
 Override the ToString method – print the article in the following format:
{title} - {content}: {autor};
Write a program that reads an article in the following format "{title}, {content}, {author}". On the next line,
you will receive a number n, representing the number of commands, which will follow after it. On the next n lines,
you will be receiving the following commands: "Edit: {new content}"; "ChangeAuthor: {new author}";
"Rename: {new title}". At the end, print the final state of the article.

 

Input

some title, some content, some author
3
Edit: better content
ChangeAuthor: better author
Rename: better title

Output

better title - better content: better author

 

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



namespace ObjectsAndClasses
{
    class MainClass
    {
        public static void Main()
        {

            string[] input = Console.ReadLine().Split(", ".ToCharArray()).ToArray();
            int n = int.Parse(Console.ReadLine());


            Article article = new Article();

            article.Title = input[0];
            article.Content = input[1];
            article.Author = input[2];

            for (int i = 0; i < n; i++)
            {
                string[] command = Console.ReadLine().Split(": ".ToCharArray()).ToArray();


                if (command[0] == "Edit")
                {
                    article.Edit(command[1]);
                }

                else if (command[0] == "ChangeAuthor")
                {
                    article.ChangeAuthor(command[1]);
                }

                else if (command[0] == "Rename")
                {
                    article.Rename(command[1]);
                }
            }
            Console.WriteLine(article.ToString());
        }

        public class Article
        {
            public object Title { get; set; }
            public object Content { get; set; }
            public object Author { get; set; }


            public void Edit(string newContent)
            {
                Content = newContent;
            }

            public void ChangeAuthor(string newAuthor)
            {
                Author = newAuthor;
            }

            public void Rename(string newTitle)
            {
                Title = newTitle;
            }

            public override string ToString()
            {
                return $"{Title} - {Content}{Author}";
            }

        }
    }
}
 

0
Fundamentals Module 25/08/2020 00:11:46
Axiomatik avatar Axiomatik 2422 Точки

Hi Elena,

You shouldn't worry about the message you received from the compiler at line 44, it's just telling you that you don't need to use ToString() in this case, as it is clear for the compiler that you are expecting a string output from the given object (whereas in foreach-loops it is required to use ToString() on a given object).

I have also added a default constructor in your Article class which allows you to directly set the default values when creating a new Article object.

However, there was a problem with your split() function, which led to wrong results and that had to be changed from Console.ReadLine().Split(", ".ToCharArray()).ToArray(); => Console.ReadLine().Split(", ", StringSplitOptions.RemoveEmptyEntries).ToArray();

ToCharArray should be used in the following context :

string someLine = "Hello World";

char[] array = someLine.ToCharArray() ;

New code(100%):

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

namespace ObjectsAndClasses
{
    class MainClass
    {
        public static void Main()
        {
            //string someLine = "Hello World";
            //char[] array = someLine.ToCharArray();

            string[] input = Console.ReadLine()
                .Split(", ", StringSplitOptions.RemoveEmptyEntries)
                .ToArray();

            int n = int.Parse(Console.ReadLine());

            Article article = new Article(input[0], input[1], input[2]);

            //article.Title = input[0];
            //article.Content = input[1];
            //article.Author = input[2];

            for (int i = 0; i < n; i++)
            {
                string[] command = Console.ReadLine()
                    .Split(": ", StringSplitOptions.RemoveEmptyEntries)
                    .ToArray();

                if (command[0] == "Edit")
                {
                    article.Edit(command[1]);
                }

                else if (command[0] == "ChangeAuthor")
                {
                    article.ChangeAuthor(command[1]);
                }

                else if (command[0] == "Rename")
                {
                    article.Rename(command[1]);
                }
            }

            Console.WriteLine(article.ToString());
        }

        public class Article
        {
            public Article(string title, string content, string author)
            {
                this.Title = title;
                this.Content = content;
                this.Author = author;
            }

            public object Title { get; set; }

            public object Content { get; set; }

            public object Author { get; set; }

            public void Edit(string newContent)
            {
                this.Content = newContent;
            }

            public void ChangeAuthor(string newAuthor)
            {
                this.Author = newAuthor;
            }

            public void Rename(string newTitle)
            {
                this.Title = newTitle;
            }

            public override string ToString()
            {
                return $"{this.Title} - {this.Content}: {this.Author}";
            }
        }
    }
}
 

2
Elena123456 avatar Elena123456 235 Точки

Hello Axiomatik,

thank you for  your quick responce.

I'am worry, because on my MonoDevelop does not work: "StringSplitOptions.RemoveEmptyEntries" and "Console.WriteLine(article.ToString());". ToString() metods is with white blue color.

At least I know the logic is correct. Thank you!

All the best!

Elena

0
Axiomatik avatar Axiomatik 2422 Точки

If you are running VS for Mac, then there have been some recent updates (around 2 weeks ago) for VS which don't allow running the program below Mac OS 13 anymore. If you are using an older version of Mac OS you should at least update to Mac OS 13 or 14 (High Sierra, Mojave), but not 15 (Catalana) if your Mac is older than 2018. After updating your Mac OS, try updating VS and everything should be working fine.

Best,

1
Elena123456 avatar Elena123456 235 Точки

Hi Axiomatik ,

I'am  running Monodevelop on Ubunto. I have updated a month ago, but I will try again. Thanks for your advice!

I think I will run  VS on Windows 10 soon for C# Advanced module.

 

0
krum_43 avatar krum_43 756 Точки

Какъв е смисъла да кастваш командата към масив от чарове след като после и казваш ToArray();

 string[] command = Console.ReadLine().Split(": ".ToCharArray()).ToArray();

 

1
28/08/2020 07:29:00
Elena123456 avatar Elena123456 235 Точки

Здравейте,

благодаря за отговора Ви.

Да, проверих, че програмата не се чупи без ".ToArray()" накрая и няма нужда от него. Бях го сложила за да съм сигурна, че входа ще бъде string [], а не char [].

Моля, бихте ли обяснили защо програмата работи и без ".ToArray()" накрая?

А ето по този начин, ако го оставя инпута вече не работи и ми подчертава всичко, което е в Split():  "string[] input = Console.ReadLine().Split(", ").ToArray();

Поздрави!

0
krum_43 avatar krum_43 756 Точки

Пробвай да замениш кавичките с апостроф  ','   !

string[] input = Console.ReadLine().Split(', ').ToArray();

 

 

 

 

1
29/08/2020 17:44:39
Elena123456 avatar Elena123456 235 Точки

За съжаление отново при мен на MonoDevelop не се получава. Само когато имам един символ мога да използвам апостроф.

В случая, когато заменя кавичките с апостроф изписва следното-"Too many characters in character literal", защото освен символа имам и празен спейс.

Но съм предоволна, че поне така работи:  string[] input = Console.ReadLine().Split(", ".ToCharArray());

Благодаря, че вметнахте, че може и без ToArray() накрая. Ще го имам предвид за вбъдеще.

 

 

1
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.