user1260827
user1260827

Reputation: 1520

parsing string and create Dictionary

I have the following string pattern: 1:2,2:3.

This is like array in one string:
The first element is: 1:2
The second element is: 2:3

I want to parse it and create a dictionary:

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

This is my code:

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 the best way to do this?

Thanks.

Upvotes: 5

Views: 7246

Answers (5)

Tilak
Tilak

Reputation: 30728

Splitting only once, using 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]));

Upvotes: 0

Nikhil Agrawal
Nikhil Agrawal

Reputation: 48560

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

Upvotes: 6

Rich O&#39;Kelly
Rich O&#39;Kelly

Reputation: 41767

If you're using C# >= 3.5 the ToDictionary LINQ method is the way to go:

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

Failing that, the following should suffice:

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;
}

Upvotes: 1

Jamiec
Jamiec

Reputation: 136154

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

Live example: http://rextester.com/GTKO60478

Upvotes: 1

Daniel Hilgarth
Daniel Hilgarth

Reputation: 174397

You could change it to this:

var d = s.Split(',')
         .Select(x => x.Split(':'))
         .ToDictionary(x => int.Parse(x[0]), x => int.Parse(x[1]));

Upvotes: 9

Related Questions