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

#c# #file #dictionary

#c# #файл #словарь

Вопрос:

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

Проблема, с которой я сталкиваюсь, заключается в том, что я не уверен, работает ли код, который у меня есть в настоящее время. В нем говорится, что ошибок нет, но я хотел бы проконсультироваться с людьми, у которых больше опыта, чтобы убедиться, что у меня правильная настройка. Я включил оба метода file writer и file reader ниже на случай, если кто-нибудь захочет увидеть метод file writer .

 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;
            }
        }
    }
}
 

Комментарии:

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

2. Что происходит, когда нет Records.txt ?

3. Нет, читатель тоже не в порядке

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

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

Ответ №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;
           }
        }
    }
}
 

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