Loading...
Denislava91 avatar Denislava91 5 Точки

How to exit a non-void method which returns a value? C#Fundamentals

Здравейте,колеги,

 

Имам един въпрос към вас.

Знаете ли как да излезем от метод, преди той да е изпълнен напълно, защото определено условие не е задоволено. Методът връща стойност и следователно не е от тип "void".

 

Става въпрос за задача Archery Tournament от Mid Exam 10 Dec 2019. Едната от проверките гласи: . If the start index is out of range of the field Iskren will have to ignore the command.

 

Та аз правя тази проверка в два отделни метод, в които изчислявам финалният индекс, след движението, съответно на ляво и дясно. Но ако началният индекс ми е извън масива , аз искам да прекъсна този метод и да се върна , там където съм го извикала първоначално т.е. в Main(). Изчетох много материал,но това, което намирам е само за void.

Мъчих се да правя отделен void method,с който просто да прекъсна return method, но voida не ме връща в Main, а в метода, от който искам да изляза.

 Качвам си и решението, което е в много суров вид и все още дава 0 точки, но за да илюстрирам какво имам предвид.

 

Много благодаря!

 

Дени

using System;
using System.Linq;

namespace _02.Archery_Tournament
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] arrayTournament = Console.ReadLine().Split('|').Select(int.Parse).ToArray();

            string input = null;

            while ((input = Console.ReadLine()) != "Game over")

            {
                //Console.WriteLine(String.Join("|", Reverse(arrayTournament, input)));
                Console.WriteLine(ShootLeft(arrayTournament,input));
            }
        }

        private static int ShootLeft(int[] arrayTournament, string input)

        {
            string[] command = input.Split('@').ToArray();
            string direction = command[0];
            int startIndex = int.Parse(command[1]);
            int lengthOfLeftMove = int.Parse(command[2]);

            if (startIndex < 0 || startIndex > arrayTournament.Length - 1)

            {
                NotValidIndex(arrayTournament, input);

            }

            else

            {
                int newIndex = (arrayTournament.Length + startIndex - lengthOfLeftMove) % arrayTournament.Length;



                if (newIndex < 0)

                {
                    newIndex = newIndex + arrayTournament.Length;
                }
                return newIndex;

            }
         


        }

        private static int ShootRight(int[] arrayTournament, string input)

        {

            string[] command = input.Split('@').ToArray();
            string direction = command[0];
            int startIndex = int.Parse(command[1]);

            if (startIndex < 0 || startIndex > arrayTournament.Length - 1)

            {

                NotValidIndex(arrayTournament, input);

            }
            int lengthOfLeftMove = int.Parse(command[2]);

            int newIndex = (startIndex + lengthOfLeftMove) % arrayTournament.Length;


            return newIndex;

        }
        private static void NotValidIndex(int[] arrayTournament, string input)

        {
            return;
        }

        private static int[] Reverse(int[] arrayTournament, string input)

        {
            int[] arrayTournamentReversed = arrayTournament.Reverse().ToArray();
            return arrayTournamentReversed;
        }
    }
}

 

Тагове:
0
Module: C# Advanced
kkaraivanov avatar kkaraivanov 486 Точки

Здравей! Ако проверяваш List<T> anyList = new List<T>(), можеш да го направиш например така

int index = incommingValue;
List<T> anyList = new List<T>()
if(index < 0 || index > anyList.Count)
{
index = anyLinst.Count - 1;
break;
}

след което ползваш индекса за обхождане от края на колекцията до началото й.

0
10/02/2020 18:56:30
Denislava91 avatar Denislava91 5 Точки

kkaraivanov, много благодаря за отговора.

Аз, обаче, искам да изляза от метода с тази проверка:

 

 private static int ShootRight(int[] arrayTournament, string input)

        {

            string[] command = input.Split('@').ToArray();
            string direction = command[0];
            int startIndex = int.Parse(command[1]);

            if (startIndex < 0 || startIndex > arrayTournament.Length - 1)

            {

                NotValidIndex(arrayTournament, input);

            }

С break не става.

 private static int ShootRight(int[] arrayTournament, string input)

        {

            string[] command = input.Split('@').ToArray();
            string direction = command[0];
            int startIndex = int.Parse(command[1]);

            if (startIndex < 0 || startIndex > arrayTournament.Length - 1)

            {

                break;

            }

Хвърля ми този коментар: No enclosing loop from which to break or continue.

 

Дори да не е в контекста на задачата, как мога да "break-на" метод, който връща стойност.

 

Благодаря!

0
nickwork avatar nickwork 657 Точки

Метода се брейква и като резултат от него задължително трябва да ретърнеш някаква стойност - като идея сложи една булева променлива "bool isYourConditionsatisfied =  false"  и да кажем ако върнеш например  "-1" това да е знак, че проверката не е минала, ако върнеш положително число - всичко е ок... не съм гледал условието на задачата, но ако метода не е воид винаги трябва да върне нещо, сам си прецини какво дали булева стойност или инт...ако е инт дадох ти един вариант как да го използваш...успех

0
kkaraivanov avatar kkaraivanov 486 Точки

Проверката

if (startIndex < 0 || startIndex > arrayTournament.Length - 1)
{
NotValidIndex(arrayTournament, input);
}

си я изпълняваш по логиката която следваш и би трябвало да изглежда

if (startIndex < 0 || startIndex > arrayTournament.Length - 1)
{
NotValidIndex(arrayTournament, input);
newIndex = arrayTournament.Length - 1;
return newIndex;
}

след изпълнение на тази проверка, метода ще върне стойността на новия индекс и няма да се изпълнява по-надолу втялото си.

0
10/02/2020 20:56:43
krum_43 avatar krum_43 756 Точки

Може ли да дадеш линк към условието на задачата?

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