Лучше метод, чем долго, если заявления в единстве c # - PullRequest
0 голосов
/ 08 апреля 2019

Я работаю над игрой, в которой у меня есть канон, который срабатывает в разное время.Вместо написания длинного оператора if, подобного этому:

If (time == 1) {
    "Do something "
} else If (time == 2) {
    "Do something else "
} else If (time == 3) {
   " You probaly get the point"
} else { 
   " My real problem is much longer than this. This is just. 
      an. 
    example"
}

Так что, если есть более простой и красивый способ сделать это в c #, это было бы здорово.Если нет, дайте мне знать также.Заранее спасибо

Ответы [ 3 ]

3 голосов
/ 08 апреля 2019

Как уже упоминалось в комментариях
Использование Заявления о переключении , вероятно, то, что вы ищете.

    private static void FireCanons(int time)
    {
        switch (time)
        {
            case 1:
                // "do something";
                break;
            case 2:
                // do something else
                break;
            case 3:
                // you probably get the point"
                break;
            default:
                // My real problem is much longer than this. This is just. an. example"
                break;
        }
    }

Обновление:
Просто просматривая ваши комментарии, Словарь может быть лучше подходит.
Вот небольшой пример, который я сделал.

    private static void FireCanons(int time)
    {
        // A Dictionary That Will Hold Our Results.
        var myList = new Dictionary<int, string>
        {
            { 1, "do something" },
            { 2, "do something else" },
            { 3, "you probably get the point" },
            { 4, "My real problem is much longer than this. This is just. an. example" }
        };

            // Attempt To Get The Value.
            if (myList.TryGetValue(time, out string result))
            {
                // Display Results.
                Console.WriteLine(result);
            }
    }
1 голос
/ 08 апреля 2019

Словарь - это другой подход.Создать словарь, в котором вы можете зарегистрировать различные действия для каждого значения time

void DoSomething()
{
    // Do something
}

void DoSomethingElse()
{
    // Do else
}

void  YouProbalGetThePoint()
{
    //  You probaly get the point
}

Зарегистрировать действия

var actions = new Dictionary<int, Action>
{
    { 1, DoSomething },
    { 2, DoSomethingElse },
    { 3, YouProbalGetThePoint },
    { 4, DoSomething },
}

Тогда использование может быть одним вкладышем: ish

var action = actions.GetValueOrDefault(time, () => {});
action();

Такой подход дает возможность изменить поведение вашего кода без изменения кода в функции - принцип Open-Close;)

0 голосов
/ 08 апреля 2019

Текущие ответы в порядке ... ответить на ваш вопрос, если time на самом деле является значением int.

Это только предположение, но обычно, когда вы говорите оtime у вас есть значение float, например, от Time.time.

Для этого ваш подход с использованием ==, switch и dictionary также будетбыть абсолютно бесполезным, поскольку вероятность того, что точное время, например, 2.0 соответствует определенному кадру, очень близка к 0.(даже не говоря о точности с плавающей запятой здесь ...)

Для этого вы, скорее всего, захотите взглянуть на сопрограммы и WaitForSeconds

Вы можете создать Метод расширения

public static class MonoBehaviourExtensions
{
    public static void Invoke(this MonoBehaviour me, Action theDelegate, float time)
    {
        me.StartCoroutine(ExecuteAfterTime(theDelegate, time));
    }

    private static IEnumerator ExecuteAfterTime(Action theDelegate, float delay)
    {
        yield return new WaitForSeconds(delay);
        theDelegate?.Invoke();
    }
}

, а затем просто использовать, например,

private void Start()
{
    this.Invoke(DoSomething, 1);
    this.Invoke(DoSomethingElse, 2);
    this.Invoke(YouGetThePoint, 3);
}

// will be executed 1 second after start
private void DoSomething()
{ ... }

// will be executed 2 seconds after start
private void DoSomethingElse()
{ ... }

// will be executed 3 seconds after start
private void YouGetThePoint()
{ ... }

Еслиесли вы хотите, чтобы они выполнялись снова после определенной задержки, вы можете просто добавить новый вызов в конце, например,

private void DoSomething()
{ 
    ... 

    this.Invoke(DoSomething, 1);
}

или, альтернативно, добавить другой метод расширения для этого:

public static class MonoBehaviourExtensions
{
    public static void Invoke(this MonoBehaviour me, Action theDelegate, float time)
    { ... }

    private static IEnumerator ExecuteAfterTime(Action theDelegate, float delay)
    { ...  }

    public static void InvokeRepeated(this MonoBehaviour me, Action theDelegate, float timeInterval)
    {
        StartCoroutine(ExecuteInIntervals(theDelegate, interval));
    }

    private static IEnumerator ExecuteInIntervals(Action theDelegate, float interval)
    {
        while(true)
        {
            yield return new WaitForSeconds(interval);
            theDelegate?.Invoke();
        }
    }
}

и затем используйте вместо

private void Start()
{
    this.InvokeRepeated(DoSomething, 1);
    this.InvokeRepeated(DoSomethingElse, 2);
    this.InvokeRepeated(YouGetThePoint, 3);
}

, поэтому DoSomething вызывается каждую секунду, DoSomethingElse вызывается каждые 2 секунд и YouGetThePoint вызывается каждые 3 секунд.

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