No bama playz Ответов: 3

Набор элементов в списке


Эй я делаю систему сохранения которая сохраняет прогресс моего 20 клиента в файле json но Прогрессы хранятся в списке и я пытаюсь сохранить их на основе номера клиента
public class User
{
    [JsonProperty("username")]
    public string Username { get; set; }

    [JsonProperty("client-progresses")]
    public int[] ClientProgresses { get; set; }
}

public static void SaveProgress(int progress, int clientNumber)
{
    var user = Program.User;

    user.ClientProgresses[clientNumber] = progress;

    var json = JsonConvert.SerializeObject(user, Formatting.Indented);
    var dir = $"{Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Saves")}";

    if (!Directory.Exists(dir))
    {
        Directory.CreateDirectory(dir);
    }

    dir = Path.Combine(dir, $"{user.Username}.json");

    lock (_fileLocker)
    {
        Task.Delay(100);
        File.WriteAllText(dir, json, new UTF8Encoding(false));
    }
}

Проблема в том, что список пуст, поэтому я не могу этого сделать.
user.ClientProgresses[clientNumber] = progress;

итак, есть какие-нибудь идеи, как бы я это установил?

Что я уже пробовал:

<pre lang="c#">
    public class User
    {
        [JsonProperty("username")]
        public string Username { get; set; }

        [JsonProperty("client-progresses")]
        public int[] ClientProgresses { get; set; }
    }

public static void SaveProgress(int progress, int clientNumber)
{
    var user = Program.User;

    user.ClientProgresses[clientNumber] = progress;

    var json = JsonConvert.SerializeObject(user, Formatting.Indented);
    var dir = $"{Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Saves")}";

    if (!Directory.Exists(dir))
    {
        Directory.CreateDirectory(dir);
    }

    dir = Path.Combine(dir, $"{user.Username}.json");

    lock (_fileLocker)
    {
        Task.Delay(100);
        File.WriteAllText(dir, json, new UTF8Encoding(false));
    }
}

Richard Deeming

Удаление содержимого вашего вопроса после того, как на него был дан ответ, - это чрезвычайно грубый.

3 Ответов

Рейтинг:
20

RickZeeland

Попробуйте это, и вы увидите, что значение присутствует:

//using Newtonsoft.Json;
//using System.IO;

var user = new User();
user.Username = "Test1";
user.ClientProgresses = new int[10];
user.ClientProgresses[1] = 1;

var json = JsonConvert.SerializeObject(user, Formatting.Indented);
File.WriteAllText("test.json", json, new UTF8Encoding(false));


Рейтинг:
18

AFell2

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

public class User
{
    [JsonProperty("username")]
    public string Username { get; set; }

    [JsonProperty("client-progresses")]
    public string[] ClientProgresses { get; set; }

    public User(int customerCount, string defaultState)
    {
        List<string> clientProgresses = new List<string>();

        for (int i = 0; i < customerCount; i++)
        {
            clientProgresses.Add(defaultState);
        }
        
        ClientProgresses = clientProgresses.ToArray();
    }
}


Таким образом, когда вы создаете своего пользователя, вы передаете как количество клиентов, которые вы хотите инициализировать, так и состояние выполнения по умолчанию для этих клиентов, например:

var user = new User(20, "init");


Таким образом, когда вы вызываете свою процедуру SaveProgress, вы можете проверить, существует ли клиент, прежде чем обновить значение в массиве, например:

if (clientNumber >= user.ClientProgresses.Length)
{
    throw new Exception($"Client number '{clientNumber}' is outside the range of the user client progress array '{user.ClientProgresses.Length}'");
}


Рейтинг:
12

Richard Deeming

Используйте словарь вместо списка или массива:

public class User
{
    [JsonProperty("username")]
    public string Username { get; set; }

    [JsonProperty("client-progresses")]
    public Dictionary<int, int> ClientProgresses { get; set; } = new Dictionary<int, int>();
}
JSON будет выглядеть примерно так:
{
    "username": "...",
    "client-progresses": {
        "42": 10,
        "64": 90
    }
}