2009-06-04 20 views
1

我有一個字符串字典中的信息列表,我想存儲在我的程序的app.config中。如何在app.config中存儲和檢索StringDictionary?

我在程序的「settings」部分創建了名爲「extentions」的條目,但是當我去使用「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); 
    } 
} 
+0

你可以粘貼你創建擴展的代碼/屏幕截圖嗎? – Grzenio 2009-06-04 15:23:51

+0

我在項目的屬性中創建了作爲collections.special.stringdictonary(我可以發佈屏幕gab,如果你真的很想要它)的擴展 – Crash893 2009-06-04 15:29:22

回答

1

我不明白您的擴展問題,但我已經使用這個代碼之前爲字符串,並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
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(); 
    } 
} 
1

下一個問題可能包含有用信息:

How to store a HashTable in the usersettings?

你所面對的問題是,兩個可用的序列化選項,當你使用一個設置。設置文件和關聯的自動生成的類將被序列化爲XML或序列化爲字符串。

StringDictionary類不支持XML和字符串序列化。有幾種方法可以解決這個限制,其中一些列出了前面提到的問題的答案。