Задание: написать метод, возвращающий запись из массива записей по передаваемому параметру

Задание: "В примере кода ниже генерируется список фиксаций состояния счета игры в течение матча. Разработайте функцию Game.getScore(offset), которая вернет счет на момент offset."

{
    class App
    {
        static void Main(string[] args)
        {
            Game.task1();
        }
    
    public struct Score
    {
        public int home;
        public int away;

        public Score(int home, int away)
        {
            this.home = home;
            this.away = away;
        }
    }

    public struct GameStamp
    {
        public int offset;
        public Score score;
        public GameStamp(int offset, int home, int away)
        {
            this.offset = offset;
            this.score = new Score(home, away);
        }
    }

    public class Game
    {
        const int TIMESTAMPS_COUNT = 50000;

        const double PROBABILITY_SCORE_CHANGED = 0.0001;

        const double PROBABILITY_HOME_SCORE = 0.45;

        const int OFFSET_MAX_STEP = 3;

        GameStamp[] gameStamps;

        public Game()
        {
            this.gameStamps = new GameStamp[] { };
        }

        public Game(GameStamp[] gameStamps)
        {
            this.gameStamps = gameStamps;
        }

        GameStamp generateGameStamp(GameStamp previousValue)
        {
            Random rand = new Random();

            bool scoreChanged = rand.NextDouble() > 1 - PROBABILITY_SCORE_CHANGED;
            int homeScoreChange = scoreChanged && rand.NextDouble() > 1 - PROBABILITY_HOME_SCORE ? 1 : 0;
            int awayScoreChange = scoreChanged && homeScoreChange == 0 ? 1 : 0;
            int offsetChange = (int)(Math.Floor(rand.NextDouble() * OFFSET_MAX_STEP)) + 1;

            return new GameStamp(
                previousValue.offset + offsetChange,
                previousValue.score.home + homeScoreChange,
                previousValue.score.away + awayScoreChange
                );
        }

        static Game generateGame()
        {
            Game game = new Game();
            game.gameStamps = new GameStamp[TIMESTAMPS_COUNT];

            GameStamp currentStamp = new GameStamp(0, 0, 0);
            for (int i = 0; i < TIMESTAMPS_COUNT; i++)
            {
                game.gameStamps[i] = currentStamp;
                currentStamp = game.generateGameStamp(currentStamp);
            }

            return game;
        }

        public static void task1()
        {
            Game game = generateGame();
            game.printGameStamps();
        }

        void printGameStamps()
        {
            foreach (GameStamp stamp in this.gameStamps)
            {
                Console.WriteLine($"{stamp.offset}: {stamp.score.home}-{stamp.score.away}");
            }
        }

        public Score getScore(int offset)
    {
        GameStamp[] stamps = this.gameStamps;
        Score score = new();
        
        var gameStamp = stamps.Last(p => p.offset == offset);
        score = gameStamp.score;
        Console.WriteLine($"{offset} - {score.home} -{score.away}");
        
        return score;   **// Вроде бы так, Но как тогда обработать исключение, потому что может не найтись GameStamp с параметром offset, он гененируется случайно**
        
    }
    }
}

Ответы (3 шт):

Автор решения: CrazyElf
  • пройти циклом по gameStamps и
  • найти последний gameStamp, у которого offset <= offset из параметра функции
  • вернуть score из этого найденного gameStamp
→ Ссылка
Автор решения: Nik 25
public Score getScore(int offset)
    {
        GameStamp[] stamps = this.gameStamps;
        Score score = new();

        try
        {
            var gameStamp = stamps.First(p => p.offset == offset);
            score = gameStamp.score;
            Console.WriteLine($"Offset: {offset} - Home: {score.home} - Away: {score.away}");
        }
        catch
        {

            Console.WriteLine("Не найдено соответствующего значения");
        }
        return score;   
        
    }  // Вроде так получается
→ Ссылка
Автор решения: x0r
public Score getScore(int offset)
{
    foreach (GameStamp stamp in this.gameStamps)
        if (stamp.offset == offset)
            return new Score(stamp.score.home, stamp.score.away);
    return new Score(0, 0);
}
→ Ссылка