2010-05-12 354 views
8

我有一个类似字符串的数组,如下所示: "test1|True,test2|False,test3|False,test4|True"。 这实质上是一个二维数组,像这样 [test1] [True] [test2] [False] [test3] [False] [test4] [True]。如何将二维数组转换为字典对象

我想这个转换成dictionary<string,bool>使用LINQ,是这样的:

Dictionary<string, bool> myResults = results.Split(",".ToCharArray).ToDictionary() 

什么想法?

+0

有类型的字符串数组没有这样的事情。我认为你的意思是一个字符串编码的数组。 – 2010-05-12 09:17:15

+0

对不起,是的,它是一个字符串,我想转换成linq语句内部的二维数组,并将其转换为字典对象。 – Webcognoscere 2010-05-12 09:21:26

+0

10这个问题的答案只是说明有多少种不同的处理方式。到目前为止,所有人的回答都略有不同,但都是有效的。我的投票是[Marcelo's](http://stackoverflow.com/questions/2817367/how-to-convert-a-2-d-array-into-a-dictionary-object/2817419#2817419),正如我的想法它是最优雅的。 – 2010-05-12 09:32:50

回答

5

首先把你的字符串转换成合适的阵列:

String sData = "test1|True,test2|False,test3|False,test4|True"; 
String[] sDataArray = sData.Split(','); 

然后你就可以处理String[]成词典:

var sDict = sDataArray.ToDictionary(
     sKey => sKey.Split('|')[0], 
     sElement => bool.Parse(sElement.Split('|')[1]) 
    ); 

ToDictionary方法有两个函数,它们从每个源数组元素中提取键和元素数据。

在这里,我通过分割“|”来提取每一半,然后使用前半部分作为关键字,第二部分解析成bool作为元素。

很显然,这不包含错误检查,因此如果源字符串不是逗号分隔的,或者每个元素不是管道分隔的,则可能会失败。所以要注意源字符串的来源。如果它完全不符合这种模式,它会失败,所以你需要做一些测试和验证。

Marcelo's答案很相似,但我认为它更优雅一些。

+0

谢谢西蒙,谢谢你解释它。 – Webcognoscere 2010-05-12 09:36:30

8
var d = results.Split(',') 
       .Select(row => row.Split('|')) 
       .ToDictionary(srow => srow[0], srow => bool.Parse(srow[1])); 
+0

辉煌,感谢一位百姓 – Webcognoscere 2010-05-12 09:32:31

-1

像这样的东西应该工作:

var fullString = "Test,True|Test2,False"; 

var query = from item in fullString.Split('|') 
      let splitted = item.Split(',') 
      let value = bool.Parse(splitted[1]) 
      select new { Key = splitted[0], Value = value }; 

var dict = query.ToDictionary(pair => pair.Key, pair => pair.Value); 
-1

你可以尝试这样的事:

var resultsArray = results.Split(','); 

var myResults = new Dictionary<string, bool>(); 

foreach (var str in resultsArray) 
{ 
    var parts = str.Split('|'); 
    myResults.Add(parts[0], bool.Parse(parts[1])); 
}