Как вы храните и извлекаете StringDictionary в app.config? - PullRequest
1 голос
/ 04 июня 2009

У меня есть список информации в строковом словаре, который я хочу сохранить в 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);
    }
}

Ответы [ 3 ]

1 голос
/ 05 марта 2010

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

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

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

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

1 голос
/ 04 июня 2009

Я не понимаю вашу проблему с расширениями, но я использовал этот код раньше для преобразования между строкой и 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();
    }

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

0 голосов
/ 04 июня 2009
  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();
    }
}
...