2012-05-15 115 views
3

我有以下字符串模式:1:2,2:3解析字符串并创建字典

这是一个字符串状阵列:
第一个元素是:1:2
第二个元素是:2:3

欲分析它并创建字典:

1,2 // 0 element in Dictionary 
2,3 // 1 element in Dictionary 

这是我的代码:

Dictionary<int,int> placesTypes = new Dictionary<int, int>(); 

foreach (var place in places.Split(',')) 
{ 
    var keyValuePair = place.Split(':'); 
    placesTypes.Add(int.Parse(keyValuePair[0]), int.Parse(keyValuePair[1])); 
} 

Is there做到这一点的最佳方式?

谢谢。

+0

使用正则表达式,如果输入相当大,可能会有更好的性能。我认为(但你应该剖析)如果输入不是太大或者函数不经常调用(因为RegEx解析/编译),那么就没有收益。 –

回答

8

你可以把它改成这样:

var d = s.Split(',') 
     .Select(x => x.Split(':')) 
     .ToDictionary(x => int.Parse(x[0]), x => int.Parse(x[1])); 
6
Dictionary<int, int> dict = "1:2,2:3".Split(',') 
          .Select(x => x.Split(':')) 
          .ToDictionary(x => int.Parse(x[0]), 
             x => int.Parse(x[1])); 
+0

这不是最好的方法,对dic组件的cuz解析将被制作两次 –

+0

是的,在调用'ToDictionary'之前编辑这个选择'第二个拆分数组',并且您已经有了我的+1。 – Rawling

+0

@Rawling:这是你问的吗? –

1
var result = input.Split(new[]{','}) 
    .Select(s => s.Split(new[]{':'})) 
    .ToDictionary(k => int.Parse(k[0]), v=> int.Parse(v[1])); 

活生生的例子:http://rextester.com/GTKO60478

1

如果您正在使用C#> = 3.5 ToDictionary LINQ方法的路要走:

var dictionary = places.Split(',') 
         .Select(place => place.Split(':')) 
         .ToDictionary(keyValue => int.Parse(keyValue[0]), keyValue => int.Parse(keyValue[1])); 

Fai应该满足以下条件:

public static Dictionary<string, string> ToDictionary(string value, char pairSeperator, char valueSeperator) 
{ 
    Dictionary<int, int> dictionary = new Dictionary<int, int>(); 
    foreach (string pair in value.Split(pairSeperator)) 
    { 
     string[] keyValue = pair.Split(valueSeperator); 
     dictionary.Add(keyValue[0], keyValue[1]); 
    } 

    return dictionary; 
} 
0

仅使用MoreLinq分裂一次。 Batch

Dictionary<int, int> dict = places.Split(',', ':').Batch(2).Select(x=>x.ToArray()).ToDictionary(x=>int.Parse(x[0]),x=>int.Parse(x[1]));