Как добавить словарные значения int к существующим переменным int

В моей программе у меня есть некоторый код, который сохраняет записи игрока в текстовый файл, организуя данные в словарь и в другом игровом сеансе, если игрок хочет загрузить свои ранее существующие данные, он должен ввести свое имя в текстовое поле, и если есть набор данных, который соответствует имени, он загрузит данные обратно.

У меня проблема в том, что я не уверен, работает ли код, который у меня сейчас есть. Он говорит, что ошибок нет, но я хотел бы проверить с людьми, у которых больше опыта, чтобы убедиться, что я правильно настроил. Я включил методы записи файлов и чтения файлов ниже на случай, если кто-то захочет увидеть метод записи файлов.

private void FileWriter(string playername, int playerwins, int computerwins, int ties)
{
    var records = new Dictionary<string, (int playerwins, int computerwins, int ties)>
    {
        {playername, (playerwins, computerwins, ties)}
    };
    StreamWriter inputfile;
    inputfile = File.AppendText("Records.txt");
    inputfile.WriteLine(records);
    inputfile.Close();
}

private void FileReader(string playername, int playerwins, int computerwins, int ties, IEnumerable<KeyValuePair<string, (int, int, int)>> records)
{
    StreamReader outputfile;
    outputfile = File.OpenText("Records.txt");
    while (!outputfile.EndOfStream)
    {
        foreach(KeyValuePair<string, (int, int, int)> res in records)
        {
            if (playername == res.Key)
            {
                playerwins +=playerwins;
                computerwins += computerwins;
                ties += ties;
            }
        }
    }
}

В вашем файле Records.txt всегда есть только одна строка. Я правильно интерпретирую это? Читатель кажется мне нормальным, но Писатель немного загадочен.

Paul Sinnema 12.12.2020 22:42

Что происходит, если нет Records.txt?

Paul Sinnema 12.12.2020 22:49

Нет, ридер тоже не в порядке

Paul Sinnema 12.12.2020 22:50

Хорошо, я сдаюсь. Чего вы пытаетесь достичь?

Paul Sinnema 12.12.2020 22:52

Как вы думаете, что произойдет в этой строке? входной файл.WriteLine(записи); Если вы думаете, что эта строка записывает значения словаря в файл, вы ошибаетесь. В этой строке записывается имя класса записей переменных, поскольку словарь не может преобразовать свои значения в строку, требуемую WriteLine.

Steve 12.12.2020 22:54

У вас есть ввод и вывод в обратном направлении. Вход — чтение, вывод — запись.

Joel Coehoorn 13.12.2020 00:33
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
91
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В вашем коде есть некоторые проблемы как в методах FileWrite, так и в FileReader.

В FileWriter у вас ошибка в строке, которая записывает в файл. Передача переменной records в StreamWriter.WriteLine приведет к тому, что имя класса будет записано в файл, а не значение элементов, хранящихся в словаре.

private void FileWriter(string playername, int playerwins, int computerwins, int ties)
{
    var records = new Dictionary<string, (int playerwins, int computerwins, int ties)>
    {
        {playername, (playerwins, computerwins, ties)}
    };
    using StreamWriter inputfile = File.AppendText(@"Records.txt");

    // Get the first element in the array
    var kvp = records.ElementAt(0);

    // write the key and the values into the file.
    inputfile.WriteLine($"{kvp.Key},{kvp.Value.playerwins},{kvp.Value.computerwins},{kvp.Value.ties}");
}

Конечно, это следует использовать только для упражнения, потому что на самом деле вам не нужно создавать словарь с одним элементом, а затем записывать один элемент на диск. Просто запишите непосредственно значения, переданные методу, в файл.

У FileReader гораздо больше проблем. Логика кода неверна. Сначала вы должны проверить, содержит ли словарь имя игрока, а затем извлечь информацию KeyValuePair, используя синтаксис массива. После этого вы можете запустить цикл для чтения строки за строкой, пока не найдете игрока, соответствующего переданному ключу. На этом этапе вы можете начать дополнения

private void FileReader(string playername, int playerwins, int computerwins, int ties, IEnumerable<KeyValuePair<string, (int, int, int)>> records)
{
     
    // Check if the dictionary contains the player
    if (records.ContainsKey(playername))
    {
        // get the KeyValuePair entry for that player by the key
        var kvp = records[playername];
        using StreamReader outputfile = File.OpenText("Records.txt");
        while (!outputfile.EndOfStream)
        {
           // Read a line and splits its content in 4 parts
           string line = outputfile.ReadLine();
           var parts = line.Split(',');

           // If is the line that matches our key...
           if (parts[0] == playername)
           {
                // Do the additions.
                playerwins += Convert.ToInt32(kvp.Value.playerwins);
                computerwins += Convert.ToInt32(kvp.Value.computerwins);
                ties += Convert.ToInt32(kvp.Value.ties);

                // No sense to continue reading the file if we have found the player
                break;
           }
        }
    }
}

У этого FileReader все еще есть проблемы. Переменные, переданные здесь, являются локальными для этого метода, и изменение значений здесь не влияет на переменные, переданные из вызывающего метода. Также переменная Records должна быть глобальной, чтобы ее можно было использовать здесь. Но это материал для другого вопроса/ответа.

Другие вопросы по теме