Страницы

Поиск по вопросам

среда, 18 декабря 2019 г.

Хранение значений List<List<string>> в файле

#c_sharp


Перед запуском приложения необходимо проинициализировать массив List>
значениями из внешнего источника, как наиболее "правильно" это сделать? Использовать
xml файл и сериализацию/десериализацию, текстовый файл или есть более красивые "традиционные"
решения хранения настроек?
    


Ответы

Ответ 1



Правильный, рекомендованный Microsoft путь — хранение данных в Settings. Единственная тонкость — в Settings непросто вставить нескалярные данные. Действуем следующим образом: Заходим в свойства проекта, вкладка Settings. Создаём Settings по умолчанию, кладём в них свойство ListOfListsOfStrings. Как тип мы не можем выбрать List>, поэтому временно выбираем просто string. Закрываем проект (важно!), заходим в каталог проекта, открываем файл Properties\Settings.settings текстовым редактором. Находим строку наподобие вбиваем правильный тип Поскольку мы редактируем XML, нам нужно кодировать < и > как < и >. Закрываем редактор, снова открываем проект. Находим в проекте файл Settings.settings в каталоге Properties, выбираем из контекстного меню Run custom tool, чтобы перегенерировать Settings.Designer.cs. Проект должен компилироваться. Добавляем код, который будет работать с Settings: static void Main(string[] args) { var settings = ListListSettings.Properties.Settings.Default; // при первом пробеге тут ничего нет, создаём if (settings.ListOfListsOfStrings == null) { settings.ListOfListsOfStrings = new List>() { new List() { "1", "2" }, new List() { "3", "4", "5" } }; settings.Save(); } } Всё! Обновление: вместо логики установки первоначального значения в Main можно прописать это самое начальное значение и в Settings.settings. Для этого нужно в качестве начального значения во вкладке Settings указать вот такую строку: 1 2 3 4 5 Её нужно именно скопировать в поле ввода Value, а не пытаться записать вручную в файл Settings.settings, потому что в файле значения < и > нужно менять на < и >. Должно получиться что-то такое: Откуда взять такую хитрую строку? Не придумывать же её самостоятельно? На самом деле, её можно найти, добавив такой код: var sample = new List>() // это тот список, который мы раньше { // записывали в settings.ListOfListsOfStrings new List() { "1", "2" }, new List() { "3", "4", "5" } }; var xs = new XmlSerializer(sample.GetType()); using (var sw = new StringWriter()) { xs.Serialize(sw, sample); var serialized = sw.ToString(); // (*) } В точке, обозначенной звёздочкой, посмотрите значение переменной serialized через отладчик — там будет именно то, что нужно: С учётом изменений, код программы упрощается до такого: static void Main(string[] args) { var settings = ListListSettings.Properties.Settings.Default; var listOfList = settings.ListOfListsOfStrings; } @Pavel Mayorov, спасибо за подсказку в комментариях.

Ответ 2



Очень удобный вариант хранения почти любых настроек предлагается проектом FSharp.Configuration. Есть несколько основных плюсов использования этого подхода, относительно способа, предложенного @VladD: Настройки будут строготипизированными - типы настроек будут проверяться при компиляции. Имеется в виду, что тип с настройками будет "создан" при компиляции по структуре дефолтного конфига. То есть числа - будут int'ами, 00:50:00 - превратится в TimeSpan и т.п. Можно использовать формат Yaml - который является понятным, чистым, поддерживает коллекции "из коробки" Не надо загружать и выгружать проект Если не "кэшировать" значение мембера в локальной переменной - то при обращении к Settings.SomeList - мы будем всегда иметь актуальное значение (статический экземпляр будет следить за файлом и перечитывать его содержимое). Пример использования из C# есть на страничке провайдера.

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

Отправить комментарий