Как написать и прочитать список <> из текстовых файлов в C # - PullRequest
0 голосов
/ 03 мая 2018

Английский не мой родной язык, и я новичок, так что не смейтесь надо мной.

Я хочу создать класс в C #, который поможет мне сохранять данные в файл и легко их читать. Это работает так:

RealObject john = new RealObject("John");
john.AddCharacter("Full Name", "Something John");
john.AddCharacter("Grade", new List<double> { 9.9, 8.8, 7.7 });
await john.SaveToFileAsync("Test.ini");

RealObject student = new RealObject("John");
await student.ReadFromFileAsync("Test.ini");
Type valueType = student.GetCharacter("Grade").Type;
List<double> johnGrade = (List<double>) student.GetCharacter("Grade").Value;

Файл "Test.ini" выглядит так:

S_Obj_John
Name    System.String   Something John
Grade   System.Collections.Generic.List`1[System.Double]    9.9;8.8;7.7
E_Obj_John

У меня есть несколько вопросов:

Вопрос 1. Можете ли вы дать мне несколько библиотек, которые выполняют эту работу для меня, пожалуйста?

Вопрос 2. Мой код слишком избыточен, как я могу его оптимизировать?

2.1 Сохранение кода: мне нужно написать похожие функции: ByteListToString, IntListToString, DoubleListToString, ...

    private static string ListToString(Type listType, object listValue)
    {
        string typeString = GetBaseTypeOfList(listType);
        if (typeString == null)
        {
            return null;
        }
        switch (typeString)
        {
            case "Byte":
                return ByteListToString(listValue);
            ..........
            default:
                return null;
        }
    }
    private static string ByteListToString(object listValue)
    {
        List<byte> values = (List<byte>) listValue;
        string text = "";
        for (int i = 0; i < values.Count; i++)
        {
            if (i > 0)
            {
                text += ARRAY_SEPARATING_SYMBOL;
            }
            text += values[i].ToString();
        }
        return text;
    }

2.2 Чтение кода: я должен написать аналогичные функции: StringToByteList, StringToIntList, StringToDoubleList, ...

    public static object StringToList(Type listType, string listValueString)
    {
        string typeString = GetBaseTypeOfList(listType);
        if (typeString == null)
        {
            return null;
        }
        switch (typeString)
        {
            case "Byte":
                return StringToByteList(listValueString);
            ..........
            default:
                return null;
        }
    }
    private static List<byte> StringToByteList(string listValueString)
    {
        var valuesString = listValueString.Split(ARRAY_SEPARATING_SYMBOL);
        List<byte> values = new List<byte>(valuesString.Length);
        foreach (var v in valuesString)
        {
            byte tmp;
            if (byte.TryParse(v, out tmp))
            {
                values.Add(tmp);
            }
        }
        return values;
    }

Спасибо за помощь

1 Ответ

0 голосов
/ 03 мая 2018

Существует два способа два распространенных способа «сериализации» данных, которые представляют собой причудливый способ взять объект и превратить его в строку. Затем с другой стороны вы можете «десериализовать» эту строку и превратить ее обратно в объект. Многим нравится JSON, потому что он действительно прост, XML все еще используется и может быть полезен для сложных структур, но для простых классов JSON действительно хорош.

Я бы проверил https://www.json.org/ и выяснил, существуют ли библиотеки, которые будут сериализовать и десериализовать для вас, что приятно. Попытка сделать это с помощью манипуляции со строками не рекомендуется, так как большинство людей (включая меня) это испортит.

Идея состоит в том, чтобы начинать и заканчивать объектами, поэтому возьмите объект и сериализуйте его, чтобы сохранить его в файл. Затем прочитайте этот объект (на самом деле просто строку или строку текста в файле) и десериализуйте его обратно в объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...