2012-05-15 43 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]));