Как сохранить и получить StringDictionary в app.config?

У меня есть список информации в строковом словаре, который я хочу сохранить в app.config для своей программы.

Я создал запись в разделе «Настройки» программы под названием «Расширения», но когда я перехожу к использованию «Settings.Default.Extentions», я получаю сообщение об ошибке, что это пустое значение.

Есть ли уловка или что-то в этом роде?

private void LoadextList()
{
    listBox1.Items.Clear();
    foreach (KeyValuePair<string, string> kvp in Settings.Default.Extentions)
    {
        listBox1.Items.Add(kvp.Key + "\t" + kvp.Value);
    }
}

person Crash893    schedule 04.06.2009    source источник
comment
Можете ли вы вставить код / ​​снимок экрана, в который вы создали расширения?   -  person Grzenio    schedule 04.06.2009
comment
Я создал расширения в свойствах проекта в настройках как collection.special.stringdictonary (я могу опубликовать экранную болтовню, если вы действительно этого хотите)   -  person Crash893    schedule 04.06.2009
comment
Я также должен упомянуть, что я могу сделать это со строкой в ​​app.config. Я просто запутался, как это сделать со строковым словарем.   -  person Crash893    schedule 04.06.2009
comment
См. Это элегантное решение stackoverflow.com/questions/338242/   -  person sll    schedule 14.10.2012


Ответы (3)


Я не понимаю вашу проблему с расширениями, но я использовал этот код раньше для преобразования между строкой и NameValueCollection - вы можете легко изменить его, чтобы использовать StringDictionary:

    public NameValueCollection StringToNameValueCollection(string KeyValueData, char KeyValueSeparator, char ItemSeparator)
    {
        NameValueCollection nvc = new NameValueCollection();

        // split string into array of key/value pairs
        string[] kvpairs = KeyValueData.Split(new char[]{ItemSeparator});

        // add each pair to the collection
        for (int i = 0; i < kvpairs.Length; i++)
        {
            if (!string.IsNullOrEmpty(kvpairs[i]))
            {
                if (kvpairs[i].Contains(KeyValueSeparator.ToString()))
                {
                    // get the key
                    string k = kvpairs[i].Remove(kvpairs[i].IndexOf(KeyValueSeparator.ToString())).Trim();
                    // get the value
                    string v = kvpairs[i].Remove(0, kvpairs[i].IndexOf(KeyValueSeparator) + 1).Trim();

                    // add key/value if key is valid
                    if (!string.IsNullOrEmpty(k))
                    {
                        nvc.Add(k, v);
                    }
                }
                else
                {
                    // no key/value separator in the pair, so add whole string as key and value
                    nvc.Add(kvpairs[i].Trim(), kvpairs[i].Trim());
                }
            }
        }
        return nvc;
    }

Преобразовать NameValueCollection в строку:

    public string NameValueCollectionToString(NameValueCollection nvc, char KeyValueSeparator, char ItemSeparator)
    {
        StringBuilder sb = new StringBuilder();

        for(int i = 0; i < nvc.Count; i++)
        {
            if (i != 0)
            {
                sb.Append(ItemSeparator);
            }
            sb.Append(nvc.Keys[i]);
            sb.Append(KeyValueSeparator);
            sb.Append(nvc[i]);
        }

        return sb.ToString();
    }

Мне пришлось внести несколько изменений в код, который я использовал, но он должен быть собран. Обратите внимание, что это не слишком снисходительно - символы-разделители не могут появляться ни в строках «ключ», ни в «значение».

person Nick    schedule 04.06.2009
comment
это, вероятно, помогло бы мне решить проблему. Я все еще чувствую, что мне не хватает чего-то фундаментального о том, что я не знаю, почему я не могу сохранить этот строковый словарь. - person Crash893; 04.06.2009
comment
Я сейчас разбираюсь в этом, но ваш первый метод выдает ошибку, что не все пути дают возврат (я, вероятно, могу понять это, но вы можете захотеть отредактировать свой код для масс) - person Crash893; 04.06.2009
comment
Спасибо, похоже, что скоба была упущена, теперь все должно быть в порядке. - person Nick; 04.06.2009

Следующий вопрос, вероятно, содержит полезную информацию:

Как сохранить HashTable в пользовательских настройках?

Проблема, с которой вы сталкиваетесь, заключается в том, что при использовании файла Settings.settings и связанного с ним автоматически сгенерированного класса доступны два варианта сериализации: сериализация в XML или сериализация в строку.

Класс StringDictionary не поддерживает ни XML, ни сериализацию строк. Есть несколько способов обойти это ограничение, и некоторые из них перечислены в ответах на ранее упомянутый вопрос.

person João Angelo    schedule 05.03.2010

  public Dictionary<string,string> StringToDictonary(string KeyValueData, char KeyValueSeparator, char ItemSeparator)
{
    Dictionary<string, string> Dic = new Dictionary<string, string>();

    string[] cells = KeyValueData.Split(ItemSeparator);
    foreach (string cell in cells)
    {
        if (!string.IsNullOrEmpty(cell))
        {
            string[] value = cell.Split(KeyValueSeparator);
            if (!string.IsNullOrEmpty(value[0]) && !string.IsNullOrEmpty(value[1]))
            {
                Dic.Add(value[0], value[1]);
            }
        }
    }
    return Dic;
}

ломать

    public string dictonaryToString(Dictionary<string, string> nvc, char KeyValueSeparator, char ItemSeparator)
    {
        StringBuilder sb = new StringBuilder();
        bool first = true;
        foreach (KeyValuePair<string,string> kvp in nvc)
        {
            if (!first)
            {
                sb.Append(ItemSeparator);
                first = false;
            }
            sb.Append(kvp.Key);
            sb.Append(KeyValueSeparator);
            sb.Append(kvp.Value);
        }
        return sb.ToString();
    }
}
person Crash893    schedule 04.06.2009