.net
  • frameworks
  • 2011-12-16 41 views 2 likes 
    2

    我如何可以分割以下字符串鍵值對/哈希表...如何轉換;將鍵值分隔的字符串轉換爲.net中的KeyValue對。

    "Id=1000;Name=xyzabc;DB=1.2.3.4;DBUserName=admin;DBPassword" 
    

    我知道它可以通過使用string.Split()(一個做「;」,然後每以'='結果)。 我正在尋找一種簡單而有效的方式來做到這一點。

    總之,而不是字符串操作是有上述高亮文本訪問值這樣的轉變的有效途徑...

    someObject["Id"];//It should return 1000 
    someObject["Name"];//It should return xyzabc 
    someObject["DB"];//It should return xyzabc .............. 
    

    框架是否在類中的任何建設辦呢?

    例如:The SQLConnectionBuilder將拆分數據庫名,用戶名,密碼進入其屬性,如果我們指定的ConnectionString到SQLConnectionBuilder

    +0

    你能提供一些更詳細的信息來確定你需要完成什麼嗎?也許有人會有更好的辦法,如果你可以將你想要做的事超越你最初的問題。 – 2011-12-16 02:57:17

    +0

    @AshokPadmanabhan,我已經添加了解釋,現在是否有意義? – KBBWrite 2011-12-16 03:33:13

    +0

    @AshokPadmanabhan其清晰的KBBwrite所需的東西,無需進一步的信息。我正在尋找一個AddRange方法(http://msdn.microsoft.com/en-us/library/system.collections.specialized.namevaluecollection.aspx),但沒有運氣...... – 2011-12-16 03:37:58

    回答

    4

    舉一個關於DbConnectionStringBuilder的例子,如果你看內部,你會發現一個名爲DbConnectionOptions.GetKeyValuePair的方法,它不適合心靈的懦弱。跳過,並嘗試一些簡單:

    string input = "Id=1000;Name=xyzabc;DB=1.2.3.4;DBUserName=admin;DBPassword"; 
    
    var kvp = input.Split(';') 
        .Select(s => s.Split('=')) 
        .ToDictionary(s => s.First(), s => s.Last()); 
    

    你會得到一個解釋輸出看起來是這樣的:

    Key=Id, Value=1000 
    Key=Name, Value=xyzabc 
    Key=DB, Value=1.2.3.4 
    Key=DBUserName, Value=admin 
    Key=DBPassword, Value=DBPassword 
    

    當然,如果你在你的字符串有重複鍵,然後字典拿下沒有工作。你可以考慮編寫你自己的擴展名,比如.ToKeyValuePair()。當你不提供價值時,我不太確定如何解決關鍵=價值問題,但我太累了,不能認真思考。

    2

    說實話,我不知道建在幫你出任何東西。這裏有兩種方式,我會考慮這樣做,

    Dictionary<string, string> keyValuePairs = new Dictionary<string,string>(); 
    
    string original = "Id=1000;Name=xyzabc;DB=1.2.3.4;DBUserName=admin;DBPassword"; 
    
    foreach(string keyValuePair in original.Split(new char[] {';'}, StringSplitOptions.RemoveEmptyEntries)) 
    { 
        string key = keyValuePair; 
        string value = string.Empty; 
    
        if (key.Contains('=')) 
        { 
         key = keyValuePair.Substring(0, keyValuePair.IndexOf('=')); 
         value = keyValuePair.Substring(keyValuePair.IndexOf('=') + 1); 
        } 
    
        keyValuePairs.Add(key.Trim(), value.Trim()); 
    } 
    

    或類似的實現,

    Dictionary<string, string> keyValuePairs = new Dictionary<string,string>(); 
    
    string original = "Id=1000;Name=xyzabc;DB=1.2.3.4;DBUserName=admin;DBPassword"; 
    
    foreach(string keyValuePair in original.Split(new char[] {';'}, StringSplitOptions.RemoveEmptyEntries)) 
    { 
        string[] keyValues = keyValuePair.Split(new char[] { '=' }, StringSplitOptions.RemoveEmptyEntries); 
    
        if (keyValues.Length == 1) 
        { 
         keyValuePairs.Add(keyValues[0].Trim(), string.Empty); 
        } 
        else if (keyValues.Length == 2) 
        { 
         keyValuePairs.Add(keyValues[0].Trim(), keyValues[1].Trim()); 
        } 
    } 
    

    這兩種解決方案給你一個字典賦予的功能做你的要求,

    someObject["Id"]; 
    

    我也會考慮把上面的代碼包裝到一個這樣的屬性中,

    private Dictionary<string, string> keyValuePairs = new Dictionary<string, string>(); 
    
    // some combination of code above to decode the original string and add 
    // stuff to the dictionary 
    
    public string this[string key] 
    { 
        get 
        { 
         if (keyValuePairs.ContainsKey(key)) 
         { 
          return keyValuePairs[key]; 
         } 
         else 
         { 
          return string.Empty; 
         } 
        } 
    } 
    

    因爲如果您引用不在字典中的密鑰,則字典會引發異常。

    相關問題