Как получить преимущество в зависимости от значения enum в C#? - PullRequest
3 голосов
/ 29 января 2020

Я пытаюсь сделать игру «Камень, бумага, ножницы», с перечислением, представляющим каждое значение, в которое играет игрок или компьютер:

public enum Choice
{
    Rock,
    Paper,
    Scissors
}

Я хочу получить преимущество в зависимости от Выбор, но я не знаю, как это сделать в C#, так как я привык к Java, что делает enum-классы модифицируемыми для создания функций внутри них. По сути, я хочу получить выбор, над которым у текущего есть преимущество. (Например, у бумаги преимущество перед камнем, у ножниц преимущество над бумагой, а у камня преимущество перед ножницами)

Ответы [ 2 ]

4 голосов
/ 29 января 2020

Я рекомендую использовать метод расширения непосредственно под вашим перечислением Choice следующим образом:

public enum Choice
{
  Rock,
  Paper,
  Scissors
}

public static class ChoiceExt
{
    public static Choice GetAdvantageByChoice(this Choice choice)
    {
        switch (choice)
        {
            case Choice.Rock:
                return Choice.Scissors;
            case Choice.Paper:
                return Choice.Rock;
            case Choice.Scissors:
                return Choice.Paper;
            default:
                throw new ArgumentException()
        }
    }
}

In GetAdvantageByChoice, который является методом расширения, типом Первым параметром будет расширенный тип, поэтому перед ним нужно добавить модификатор this.

Кроме того, как сказал Йерун Мостерт, вы можете написать switch более кратко:

public static Choice GetAdvantageByChoice(this Choice choice) =>
  choice switch
  {
      Choice.Paper => Choice.Rock,
      Choice.Rock => Choice.Scissors,
      Choice.Scissors => Choice.Paper,
      _ => throw new ArgumentException()
  };
2 голосов
/ 29 января 2020

Более простое и элегантное решение с использованием выражения C # 8 switch

var choice = Choice.Paper; //for example
var result = choice switch
{
    Choice.Paper => Choice.Rock,
    Choice.Rock => Choice.Scissors,
    Choice.Scissors => Choice.Paper,
    _ => throw new ArgumentOutOfRangeException()
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...