Простейший анализ пар ключей / значений в .NET - PullRequest
9 голосов
/ 12 ноября 2008

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

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

Я мог бы сам написать такой класс, но я бы лучше узнал, как он работает, чем дважды изобрел колесо. Есть ли в .NET (3.5) встроенный магический класс, способный сделать это?

MagicClass kv = new MagicClass("Settings.ini"); // It doesn't neccesarily have to be an INI file, it can be any simple key/value pair format.
string Value1 = kv.get("Key1");
...

Ответы [ 5 ]

7 голосов
/ 17 декабря 2014

Если вы ищете быструю простую функцию и не хотите использовать файлы настроек .Net app \ user config или беспокоитесь о проблемах сериализации, которые иногда возникают со временем.

Следующая статическая функция может загрузить файл, отформатированный как «KEY = VALUE».

    public static Dictionary<String, String> LoadConfig(string settingfile)
    {
        var dic = new Dictionary<String, String>();

        if (File.Exists(settingfile))
        {
            var settingdata = File.ReadAllLines(settingfile);
            for (var i = 0; i < settingdata.Length; i++)
            {
                var setting = settingdata[i];
                var sidx = setting.IndexOf("=");
                if (sidx >= 0)
                {
                    var skey = setting.Substring(0, sidx);
                    var svalue = setting.Substring(sidx+1);
                    if (!dic.ContainsKey(skey))
                    {
                        dic.Add(skey, svalue);
                    }
                }
            }
        }

        return dic;
    }

Примечание. Я использую словарь, поэтому ключи должны быть уникальными, что обычно имеет место при настройке.

ИСПОЛЬЗОВАНИЕ:

    var settingfile = AssemblyDirectory + "\\mycustom.setting";
    var settingdata = LoadConfig(settingfile);
    if (settingdata.ContainsKey("lastrundate"))
    {
        DateTime lout;
        String svalue;
        if (settingdata.TryGetValue("lastrundate", out svalue))
        {
            DateTime.TryParse(svalue, out lout);
            lastrun = lout;
        }
    }
6 голосов
/ 12 ноября 2008

Используйте класс KeyValuePair для своего ключа и значения, а затем просто сериализируйте Список на диск с XMLSerializer .

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

6 голосов
/ 12 ноября 2008

Я не знаю ни одного встроенного класса для анализа INI-файла. Я использовал nini , когда это было необходимо. Он лицензирован по лицензии MIT / X11, поэтому нет проблем для включения в программу с закрытым исходным кодом.

Это очень удобно. Так что если у вас есть файл Settings.ini, отформатированный таким образом:

[Configuration]
Name = Jb Evain
Phone = +330101010101

Использовать его так же просто, как:

var source = new IniConfigSource ("Settings.ini");
var config = source.Configs ["Configuration"];

string name = config.Get ("Name");
string phone = config.Get ("Phone");
2 голосов
/ 12 ноября 2008

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

key1,value1
key2,value2
...

Синтаксический анализ прост: прочитайте файл, разделите его символом новой строки или запятой, затем возьмите элементы попарно

0 голосов
/ 12 ноября 2008

Отформатируйте файл следующим образом:

key1=value1
key2=value2

Считайте весь файл в строку (для этого есть простая вспомогательная функция, возможно, в классе File или string) и вызовите string.Split ('='). Убедитесь, что вы также вызываете string.Trim () для каждого ключа и значения при обходе списка и вставке каждой пары в хеш-таблицу или словарь.

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