2017-02-16 290 views
1

我有一個字符串字符串數據轉換爲字典

string data = "[City, Delhi]&[State, DL]&[Country, IN]"; 

從中我想的字典。

我想的方法是

  1. 拆分的 「&」
  2. 在所得的陣列,解析每個元件 2.1替換 「[」 和 「]」 2.2插入到字典

我討厭這種方法,因爲我的字符串已經有「[」和「]」,我應該可以直接將它添加到Dictionary中。

+0

你通過_should的意思是能夠直接將其添加到Dictionary_? –

+0

當我看字典中的元素時,我用格式「[key,value]」來看它們。我希望能夠從這個字符串 – Rajat

回答

5

這是一個很好的使用情況進行定期表達式。

var d = Regex.Matches(data, @"\[(?<k>[^,]+), (?<v>[^]]+)\]") 
    .OfType<Match>() 
    .ToDictionary(m => m.Groups["k"].Value, m => m.Groups["v"].Value); 
+0

我喜歡你的答案。我確實有疑問。假設我的字符串是「」[City,Delhi]&[State,DL]&[Country,IN]&Weather,cold]「;」我運行代碼。我確實得到了正確的輸出。但是如果比賽失敗,我沒有辦法採取行動。 – Rajat

+0

使用該字符串時,第四個值不匹配,因爲它不符合您指定的格式。對於符合條件的用戶,您可以直接枚舉'Regex.Matches()'的結果並在添加到字典之前對它們進行評估。如果您在數據字符串中表示方括號是可選的,那麼解決方案會稍有不同。 –

+0

不,我並不是說方括號是可選的,但由於這是用戶提供的數據,所以不能保證。是的,我同意你說的驗證方法。感謝您的時間 – Rajat

3

你所描述的方法可能和它將要獲得的一樣好。

一個天真的實現(沒有錯誤處理)將是:

var pairs = data.Split('&'); 

var dict = new Dictionary<string, string>(); 

foreach (var pair in pairs) 
{ 
    var parts = pair.Split(','); 

    dict.Add(
     parts[0].TrimStart('['), 
     parts[1].TrimStart().TrimEnd(']')); 
} 

或者,使用正則表達式來獲取鍵和值:

string data = "[City, Delhi]&[State, DL]&[Country, IN]"; 

var pairs = data.Split('&'); 

var dict = new Dictionary<string, string>(); 

var regex = new System.Text.RegularExpressions.Regex(@"\[(?<key>.*), (?<value>.*)\]"); 

foreach (var pair in pairs) 
{ 
    var match = regex.Match(pair); 

    // TODO: Error if match.Success == false ? 

    dict.Add(match.Groups["key"].Value, match.Groups["value"].Value); 
} 
+0

創建一個包含數據「[City,Delhi]」,「[State,DL]」,「[Country,IN]」的字典感謝您的回答,@Richard。但是,我的目標不是我所描述的可能方法。我們不能做一些事情而不去做角色的替換嗎? – Rajat

+0

使用部分使用正則表達式的替代方法更新了我的答案。 –

+1

謝謝理查德。我傾向邁克的回答。但是,如果正則表達式不匹配,您的答案確實提供了更大的靈活性。我想知道這是否可以納入麥克的答案。 – Rajat

0

可以使用linq

string data = "[City, Delhi]&[State, DL]&[Country, IN]"; 
string[] arr = data.Replace("[", "").Replace("]", "").Split('&'); 
var dict = arr.ToList().ToDictionary(x => x.Split(',')[0], x => x.Split(',')[1]); 
+0

我試圖避免更換。這就是爲什麼我問這個問題 – Rajat

+0

我不認爲你可以避免'replace'。 – Mairaj

+0

根據我的回答,如果您使用正則表達式,則可以避免使用「替換」。 –

0

試試這個試試這個...

private static void Splitter() 
    { 
     string data = "[City, Delhi]&[State, DL]&[Country, IN]"; 
     Dictionary<string,string> dOutput = new Dictionary<string,string>(); 
     string[] sArr = data.Split('&'); 

     var v = from p in sArr 
       select p.Replace("[", "").Replace("]", "").Split(','); 

     var v2 = (from p in v 
       select p).ToDictionary(item => item[0], item => item[1]); 


     Console.WriteLine(v2.Count()); 

    } 

v2是一個字典對象......

+0

其他人,你能否提出建議我們如何結合這兩個LINQ語句? – A3006