2017-02-16 155 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